Activity生命周期-启动模式

生命周期


这里写图片描述

Activity 四种状态:

运行,暂停,停止,销毁。

1.Activity第一次启动时生命周期调用顺序:onCreate()->onStart()->onResume(),此时 Activity 处于运行状态,执行 onStart()方法后 Activity 变为可见,但未出现在前台,没有获得焦点,onResume()获取焦点可以进行交互。onCreate()方法中可以加载布局资源初始化和初始化一下 Activity 需要的数据。
2. Activity 被非全屏窗口覆盖,会失去焦点,处于暂停状态回调onPause()方法。在onPause()方法做一些数据存储,停止动火,暂停播放音视频等操作,不能太耗时,否则影响新 Activity显示。
3. Activity 被完全覆盖,由暂停变为停止状态回调 onStop()方法,此时 Activity 不可见。onStop()方法可以做一些资源回收工作,不能太耗时。
4. Activity不可见后,可能会由于系统内存缺乏被回收。调用 finish()方法会回调 onDestroy()销毁,在这个方法中做资源回收工作。

切换Activity时生命周期 [Activity(A)与Activity(B)]

A->B : A:onPause()->B:onCreate()->B:onStart()->B:onResume()->A:onStop();
B->A:B:onPause()->A:onRestart()->A:onStart()->A:onResume()->B:onStop();
A->B :如果 B是透明主题 A 不会回调 onStop();

Home和Back键

1.Home回到主界面(Activity不可见)–>onPause()–>onStop()依次被调用;
2.Back键回退,Activity将被销毁,退出当前Activity–>onPause()–>onStop()–>onDestroy()依次被调用;

横竖屏切换

设置横竖屏切换

setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);

获取横竖屏方向

int orientation = getResources().getConfiguration().orientation;

在清单文件中给 Activity设置configChanges 属性横竖屏切换 Activity 不会重建

/**configChanges属性可以设置多个值,中间使用竖线分割; 
1. orientation 屏幕在纵向和横向间旋转 
2.keyboardHidden 键盘显示或隐藏 
3.screenSize 屏幕大小改变了 
4.fontScale 用户变更了首选的字体大小 
5.locale 用户选择了不同的语言设定 
6.keyboard 键盘类型变更,例如手机从12键盘切换到全键盘 
7.touchscreen或navigation 键盘或导航方式变化,一般不会发生这样的事件
**/
android:configChanges="orientation|keyboardHidden|screenSize"

设置了android:configChanges属性后onConfigurationChanged方法在屏幕方向发生改变时会被回调。

//屏幕方向发生改变的回调方法
    @Override
    public void onConfigurationChanged(Configuration newConfig) {
        if (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE) {
        //当前屏幕为横屏
        } else {
       //当前屏幕为竖屏
        }
        super.onConfigurationChanged(newConfig);
        Log.e("TAG", "onConfigurationChanged");
    }

1.不设置Activity的android:configChanges时,切屏会重新调用各个生命周期,切横屏时会执行一次,切竖屏时会执行两次
2.设置Activity的android:configChanges=”orientation”时,切屏还是会重新调用各个生命周期,切横、竖屏时只会执行一次
3.设置android:configChanges=”orientation|keyboardHidden|screenSize”时,切屏不会重新调用各个生命周期,只会执行onConfigurationChanged方法。

onSaveInstanceState()与 onRestoreInstanceState()

Activity在异常终止时才会调用这两个方法来存储和恢复数据,比如横竖屏切换。onSaveInstanceState在 onStop之前调用,与 onPause 没有既定的时序关系。onRestoreInstanceState在 onStart()之后调用。onRestoreInstanceState与 onCreate都会接收 onSaveInstanceState存储的 Bundle 数据。区别是如果onRestoreInstanceState被调用 Bundle 一定有值,onCreater如果是正常启动 Bundle为 null,需要额外判断。所以推荐onRestoreInstanceState恢复数据。

扫描二维码关注公众号,回复: 2430635 查看本文章

启动模式


  1. standard:标准模式,每次启动都会重建一个新实例,这种模式下谁启动了这个 Activity,这个 Activity 就属于它所在的任务栈。一个任务栈可以有多个实例,每个实例也可以属于多个任务栈。用ApplicationContext启动这个模式的 Activity 会报错,因为非 Activity 类型的 Context并没有任务栈。解决这个问题的方法是指定一个标志位:FLAG_ACTIVITY_NEW_TASK,这样会创建一个新任务栈给这个 Activity。
  2. singleTop:栈顶复用模式,如果 Activity 已经位于栈顶,此Activity 不会重建,会回调 onNewIntent方法,不调用 onCreate,onStart。
  3. singleTask:栈内复用模式,只要一个栈中存在,此 Activity 就不会重建,和 singleTop一样会回调 onNewIntent方法。此模式具有 clearTop效果,使在其上面的 Activity全部出栈。
  4. singleInstance:单例模式,除了具有 singleTask 的所有特性,还独自占用一个任务栈。

TaskAffinity标识一个 Activity 所需任务栈名字,默认情况下所有 Activity所需任务栈名字为应用包名。我们可以为每一个 Activity 单独指定这个属性。注意:这个属性值为字符串,中间必须包含有包名分隔符“.”。

猜你喜欢

转载自blog.csdn.net/qq_23621841/article/details/80892417