小酌Activity生命周期

深入理解Activity生命周期

事实上在安卓的官网对Activity的生命周期有详尽的解释,而且是中文的!
https://developer.android.com/guide/components/activities.html
相信各位早已用过Activity,但是其中的几个生命周期接口还是值得整理关注.通过对官方文档的理解,我们把Activity的生命周期相关记忆点分解为几个问题.

参照谷歌官方给出的图例:
这里写图片描述

1.生命周期是什么?

Activity是用户与程序交互的接口,它提供了一个用户完成相关操作的窗口.在Android系统中,系统是通过Activity栈来管理Activity的,而Activity则是通过生命周期的方式来管理自身的创建,暂停,销毁等状态的.就像我们主宰一个人的命运,设定,我们说,当这个人出生的时候我们做一些事情比如烧香拜佛,当这个人生病的时候我们要求医问药,当这个人死亡的时候我们要举行追悼会等等,Activity的生命周期就是它从生成到消亡的过程,我们可以通过系统提供的接口,来决定其在不同的状态执行什么样的代码.

Activity的主要生命周期为:onCreate->onStart->onResume->Activity运行->新的Activity运行->onPause->onStop->onDestroy->Activity销毁

  • 没有图而需要回忆的的话可以简记为:主线:CSRPSD(长沙如盘丝洞);支线:PR(骗人!),SRS(谁认识!)
1.在手机直观的状态切换中,生命周期中怎样转变?

我简单列出脑海中存在的手机的几种直观的状态
这里写图片描述

现在要将其各种状态进行实验和组合.代码如下.

public class MainActivity extends Activity {

    private static final String TAG = "MainActivity";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        Log.d(TAG, "onCreate() called with: savedInstanceState = [" + savedInstanceState + "]");
    }

    @Override
    protected void onStart() {
        super.onStart();
        Log.d(TAG, "onStart() called");
    }

    @Override
    protected void onResume() {
        super.onResume();
        Log.d(TAG, "onResume() called");
    }

    @Override
    protected void onPause() {
        super.onPause();
        Log.d(TAG, "onPause() called");
    }

    @Override
    protected void onStop() {
        super.onStop();
        Log.d(TAG, "onStop() called");
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        Log.d(TAG, "onDestroy() called");
    }

    @Override
    protected void onRestart() {
        super.onRestart();
        Log.d(TAG, "onRestart() called");
    }

}

1.点击icon:

D/MainActivity: onCreate() called with: savedInstanceState = [null]
D/MainActivity: onStart() called
D/MainActivity: onResume() called

此时进入正常运行状态.

2.正常运行->按任务键/home键

D/MainActivity: onPause() called
D/MainActivity: onStop() called

3.任务视图->按返回键

D/MainActivity: onRestart() called
D/MainActivity: onStart() called
D/MainActivity: onResume() called

4.任务视图->按home键/切换新任务
没有输出.此时进入后台运行状态.

5.任务视图->滑动杀死应用

Application terminated.

6.正常运行->按锁屏键

D/MainActivity: onPause() called
D/MainActivity: onStop() called

在其他Activity回退:
两个Activity切换:

:D/MainActivity: onPause() called
新:D/Main2Activity: onCreate() called with: savedInstanceState = [null]
新:D/Main2Activity: onStart() called
新:D/Main2Activity: onResume() called
D/MainActivity: onStop() called

从新的Activity中按back键回退到上一个Activity

D/Main2Activity: onPause() called
旧D/MainActivity: onRestart() called
D/MainActivity: onStart() called
D/MainActivity: onResume() called
D/Main2Activity: onStop() called
D/Main2Activity: onDestroy() called

7.待解锁状态->按解锁键

D/MainActivity: onRestart() called
D/MainActivity: onStart() called
D/MainActivity: onResume() called

此时进入”正常运行”状态

由以上实验我们可以简单归纳:
1.Activity第一次创建时,执行onCreate->onStart->onResume,然后正常运行
2.Activity在进入任务视图/进入锁屏状态/按home键,都是经历了onPause->onStop的阶段.
3.Activity从任务视图恢复/从待解锁状态恢复,都是经历了onRestart->onStart->onResume的阶段.
4.切换旧Activity到新Activity:旧onPause,新onCreate,onStart,onResume,旧onStop
5.从新Activity按返回键退回至上一个Actitvity:新onPause,旧onRestart,onStart,onResume,新onStop,onDestory.

事实上,Activity的生命周期两两相对,有规律可循.
1.从Activity的创建与消亡看,onCreate与onDestory相对,都只能调用一次.
2.从Activity是否可见看,onStart与onStop相对,可以转换,可以调用多次
3从Activity是否在最前端看,onResume与onPause相对.

优化建议

官方建议,不能再onPause中做重量的操作–因为必须onPause执行完后,其他的Activity才执行Resume.应当在onStop中执行耗时操作.

关于Activity的特殊生命周期

1.Activity在异常情况下被销毁时,系统会调用onSaveInstanceStatus来保存当前Activity的状态,在恢复时调用onRestoreInstanceStatus来恢复状态.屏幕翻转是典型的意外情况.
这里写图片描述
它与正常的生命周期没有交集,不固定在其中某一个周期点的之前或之后.
2.保存的数据有:文本框中的字符,滚动位置等.

代码样例:

public class MainActivity extends Activity {

    private static final String TAG = "MainActivity";
    private Context mContext;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        this.mContext = this;
        Log.d(TAG, "onCreate() called with: savedInstanceState = [" + savedInstanceState + "]");
        setContentView(R.layout.activity_main);
        if (savedInstanceState != null) {//如果存在保存的数据,就获取字符串并打印
            String testText = savedInstanceState.getString("testText");
            Log.i(TAG, "onCreate: restore test:" + testText);
        }


    }

    //异常停止Activity
    @Override
    protected void onSaveInstanceState(Bundle outState) {
        super.onSaveInstanceState(outState);
        Log.i(TAG, "onSaveInstanceState: ");
        outState.putString("testText", "eee");

    }
    //重建Activity
    @Override
    protected void onRestoreInstanceState(Bundle savedInstanceState) {
        super.onRestoreInstanceState(savedInstanceState);
        String testStr = savedInstanceState.getString("testText");
        Log.i(TAG, "onRestoreInstanceState: restore testText:" + testStr);
    }

    @Override
    protected void onStart() {
        super.onStart();
        Log.d(TAG, "onStart() called");
    }

    @Override
    protected void onResume() {
        super.onResume();
        Log.d(TAG, "onResume() called");
    }

    @Override
    protected void onPause() {
        super.onPause();
        Log.d(TAG, "onPause() called");
    }

    @Override
    protected void onStop() {
        super.onStop();
        Log.d(TAG, "onStop() called");
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        Log.d(TAG, "onDestroy() called");
    }

    @Override
    protected void onRestart() {
        super.onRestart();
        Log.d(TAG, "onRestart() called");
    }

}

当横屏时,输出为:

D/MainActivity: onPause() called
I/MainActivity: onSaveInstanceState: 
D/MainActivity: onStop() called
D/MainActivity: onDestroy() called
D/MainActivity: onCreate() called with: savedInstanceState = [Bundle[{testText=eee, android:viewHierarchyState=Bundle[{android:views={16908290=android.view.AbsSavedState$1@e18b540, 2131427414=android.view.AbsSavedState$1@e18b540}, android:Panels={0=com.android.internal.policy.PhoneWindow$PanelFeatureState$SavedState@73edc79}}]}]]
I/MainActivity: onCreate: restore test:eee
D/MainActivity: onStart() called
I/MainActivity: onRestoreInstanceState: restore testTexteee
D/MainActivity: onResume() called

从日志可以看出,当屏幕横转之后的瞬间,,Activity执行onPause->onStop->onDestory的周期,其中系统调用了onSaveInstanceState方法,保存了outState参数对,下一个瞬间,Activity重新被创建,而onCreate方法中也确实发现了保存好的savedInstance,而打印其中的String则确实输出刚刚保存的内容.

参考资料:<

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值