Android 四大组件之Activity(Activity/Fragment)
本文由 Luzhuo 编写,转发请保留该信息.
原文: http://blog.csdn.net/rozol/article/details/79606158
四大组件(Activity / BroadcastReceiver / Service / ContentProvider)之一
四大组件均运行于主线程
Activity
生命周期
Activity的生命周期种类:
- onCreate // 创建
- onStart // 可见, 无焦点
- onResume // 获得焦点, 此时为前台Activity
- onPause // 失去焦点, 仍可见
- onStop // 不可见, 此时为后台Activity
- onDestroy // 销毁
- onRestart // 重启
Activity的生命周期流程:
/* 打开SecondActivity的生命周期: MainActivity: onPause - - - - - - - -- - - - - -- - - - -> onStop SecondActivity: onCreate -> onStart -> onResume 关闭SecondActivity的生命周期: MainActivity: onStart -> onResume SecondActivity: onPause - - - - - - - - - - -> onStop -> onDestroy 打开ThirdActivity(部分透明)的生命周期 MainActivity: onPause ThirdActivity: onCreate -> onStart -> onResume 关闭ThirdActivity(部分透明)的生命周期 MainActivity: onResume ThirdActivity: onPause - - - - - -> onStop -> onDestroy 切换到Home桌面 MainActivity: onPause -> onStop Home桌面切换回来 MainActivity: onRestart -> onStart -> onResume ThirdActivity(部分透明)切换到Home桌面 MainActivity: onStop ThirdActivity: onPause - - - -> onStop Home桌面切换回ThirdActivity(部分透明) MainActivity: onRestart -> onStart ThirdActivity: onRestart -> onStart -> onResume Activity被kill优先级: onStop(后台进程, 且不可见) > onPause(前台进程, 但无焦点) > running(前台) 多个同级进程, 按LRU算法选择 */
进程被kill的5个级别
- 进程被kill的5个级别
-
- 前台进程: 用户能与Activity交互的进程(相当于onResume())
-
- 可视进程: 用户能对Activity可见, 但是不能对其进行操作(没有焦点, 相当于onPause())
-
- 服务进程: 没有界面, 通过startService()开启的服务
-
- 后台进程: 用户不可见 (相当于onStop())
-
- 空进程: 没有维持任务组件运行, 不kill是为了下次开启速度
*/
- 空进程: 没有维持任务组件运行, 不kill是为了下次开启速度
-
屏幕横竖切换时的生命周期
/*
屏幕横竖时Activity的生命周期:
MainActivity: onPause -> onStop -> onDestroy -> onCreate -> onStart -> onResume
不触发生命周期的配置:
<activity android:name=".MainActivity" android:configChanges="orientation|keyboardHidden|screenSize">
锁死屏幕:
方式一:
配置文件配置: <activity android:name=".MainActivity" android:screenOrientation="portrait">
landscape:横屏
portrait: 竖屏
方式二:
代码设置: setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
*/
启动模式
启动模式清单配置
<activity android:name=".MainActivity" android:launchMode="standard">启动模式种类:
- standard: 标准(默认); 后进新出
- singleInstance: 单例模式; 启动时, 会在一个新的任务栈启动, 并且只会启动一次, 当再次启动时, 将该任务栈移至前台
- singleTask: 单任务模式; 如果该Activity没有启动, 则会启动, 如果启动过, 则返回该Activity, 并清除上方所有Activity
- singleTop: 栈顶模式; 如果此时栈顶是该Activity则不启动, 不是则启动
在没有任务栈的地方开启Activity
在服务或广播接收者等没有任务栈的地方开启Activity
Intent intent1 = new Intent(context,MainActivity.class); // 如果在广播或服务等没有任务栈的地方开启Activity, 需要设置一个任务栈环境 intent1.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); context.startActivity(intent1);
Activity间传递数据
MainActivity打开DataActivity, 并接收返回回调
public void onclick2(View view){ Intent intent = new Intent(this, DataActivity.class); startActivityForResult(intent, 10); } /** * 如果是startActivityForResult打开的Activity, 在销毁时就会调用 */ @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); if (requestCode == 10){ if (resultCode == 123) { String value = data.getStringExtra("key1"); Log.i(TAG, value); } } }销毁DataActivity, 并设置返回数据
Intent intent = new Intent(); intent.putExtra("key1", "value2"); // 当前Activity销毁时, intent意图会传递给启动当前Activity的那个Activity setResult(123, intent); finish();
Fragment
Fragment 由 Android3.0 引入的, 初衷是为了适应大屏幕的平板
Fragment 有自己的生命周期, 但同时又受宿主Activity生命周期的影响
使用
添加: (不断的叠加)
context.getSupportFragmentManager().beginTransaction().add(containerId, target).commit();替换: (销毁旧的, 创建一个新的替换, 影响生命周期)
context.getSupportFragmentManager().beginTransaction().replace(containerId, target).commit();隐藏: (隐藏旧的, 显示新的, 不影响生命周期)
FragmentTransaction transaction = context.getSupportFragmentManager().beginTransaction(); transaction.hide(oldFragment); transaction.show(newFragment).commit();
生命周期
Fragment依附于Activity而生
Fragment生命周期种类:
- onAttach // 依附于Activity
- onCreate // 创建
- onCreateView // 加载一个Fragment布局(View)
- onActivityCreated // View已初始化
- onStart // 可见
- onResume // 获取焦点
- onPause // 失去焦点
- onStop // 不可见
- onDestroyView // 销毁 onCreateView 创建的View
- onDestroy // 销毁
- onDetach // 取消依附
Fragment生命周期流程:
生命周期: 创建/切换Fragment:onAttach -> onCreate() -> onCreateView -> onActivityCreated -> onStart() -> onResume | -> onPause -> onStop -> onDestroyView -> onDestory -> onDetach Home键:Fragment: ... | -> onPause -> onStop home切换回来Fragment: onStart() -> onResume 隐藏和显示不影响生命周期

ViewPager + Fragment
FragmentsActivity
public class FragmentsActivity extends AppCompatActivity {
ViewPager viewPager;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_viewpager);
Fragment[] fragments = getFragments();
viewPager = findViewById(R.id.viewpager);
// 如果运行于Fragment中, 则需使用 getChildFragmentManager()
FragmentAdapter adapter = new FragmentAdapter(getSupportFragmentManager(), fragments);
viewPager.setAdapter(adapter);
viewPager.setCurrentItem(0);
}
public Fragment[] getFragments() {
Fragment[] fragments = new Fragment[2];
fragments[0] = new Fragment1();
fragments[1] = new Fragment2();
return fragments;
}
}
FragmentAdapter
public class FragmentAdapter extends FragmentPagerAdapter {
private final FragmentManager fragmentManager;
private final Fragment[] fragments;
public FragmentAdapter(FragmentManager fm, Fragment[] fragments) {
super(fm);
this.fragmentManager = fm;
this.fragments = fragments;
}
@Override
public Fragment getItem(int position) {
return fragments[position];
}
@Override
public int getCount() {
return fragments == null ? 0 : fragments.length;
}
}
本文详细探讨了Android中的Activity和Fragment。讲解了Activity的生命周期,包括进程被kill的5个级别和屏幕横竖切换时的变化,以及不同启动模式的原理。此外,还介绍了Fragment的使用方式,生命周期及其在ViewPager中的应用。通过本文,读者可以深入理解这两个关键组件的工作机制。
480

被折叠的 条评论
为什么被折叠?



