Android(安卓)四大组件之Activity(Activity/Fragment)
16lz
2021-01-24
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 -> onStopHome桌面切换回来 MainActivity: onRestart -> onStart -> onResumeThirdActivity(部分透明)切换到Home桌面 MainActivity: onStop ThirdActivity: onPause - - - -> onStopHome桌面切换回ThirdActivity(部分透明) MainActivity: onRestart -> onStart ThirdActivity: onRestart -> onStart -> onResumeActivity被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不触发生命周期的配置: 锁死屏幕: 方式一: 配置文件配置: landscape:横屏 portrait: 竖屏 方式二: 代码设置: setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE); */
启动模式
启动模式清单配置
启动模式种类:
- 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, 在销毁时就会调用 */@Overrideprotected 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的那个ActivitysetResult(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 -> onDetachHome键:Fragment: ... | -> onPause -> onStophome切换回来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; }}
更多相关文章
- No.11 使用firewall配置的防火墙策略的生效模式
- 一款霸榜 GitHub 的开源 Linux 资源监视器!
- 关于 AndroidManifest
- android中各种组件的生命周期问题
- 打电话的应用程序源码以及Android基础-----Android生命周期
- 【Android】 adb shell 下 setting 指令
- Android的系统服务一览 .
- android中如何查看内存
- Android(安卓)Service之onStartCommand方法研究