Activity生命周期你确信懂了吗?(一)

作为一个安卓开发者,如果activity的生命周期都不能完全理解透彻,那还是一个合格的安卓开发者吗? 公司业务扩张,近期一直在招聘,有幸作为陪面,见过不少的开发者,2年的、3年的、4年的都有。在这些应聘者中能够完全讲透activity生命周期的的真实寥寥无几。所以一直就在想为什么这么基础的一个问题,有这么多的人无法讲清楚呢?原因很简单:简单的不屑研究,复杂的研究不了。但是我建议大家还是立足基本,稳步提升。下面我们细细聊聊生命周期的问题。

基本概念

activity生命周期的基本知识,没有人不知道,而且官方有张图一目了然,在这里就不所讲了。如果你不知道,建议到官方开发者中心好好看看。中国地址:https://developers.google.cn/ 全球地址:http://developer.android.com/index.html

项目结构

下面是我们本次研究的基础代码。

  • 自定义Application,注册生命周期生命函数,方便打日志
registerActivityLifecycleCallbacks(new ActivityLifecycleCallbacks() {
            @Override
            public void onActivityCreated(Activity activity, Bundle savedInstanceState) {
                Log.i(TAG, String.format("onCreate()==>>%s", activity.getClass().getName()));
            }

            @Override
            public void onActivityStarted(Activity activity) {
                Log.i(TAG, String.format("onStart()==>>%s", activity.getClass().getName()));
            }

            @Override
            public void onActivityResumed(Activity activity) {
                Log.i(TAG, String.format("onResume()==>>%s", activity.getClass().getName()));
            }

            @Override
            public void onActivityPaused(Activity activity) {
                Log.i(TAG, String.format("onPause()==>>%s", activity.getClass().getName()));
            }

            @Override
            public void onActivityStopped(Activity activity) {
                Log.i(TAG, String.format("onStop()==>>%s", activity.getClass().getName()));
            }

            @Override
            public void onActivitySaveInstanceState(Activity activity, Bundle outState) {
                Log.i(TAG, String.format("onSaveInstanceState()==>>%s", activity.getClass().getName()));
            }

            @Override
            public void onActivityDestroyed(Activity activity) {
                Log.i(TAG, String.format("onDestroy()==>>%s", activity.getClass().getName()));
            }
        });
  • 使用MainActivity测试
2019-03-17 13:42:13.245 19044-19044/com.litets.android.life I/life_tag: onCreate()==>>com.litets.android.life.MainActivity
2019-03-17 13:42:13.422 19044-19044/com.litets.android.life I/life_tag: onStart()==>>com.litets.android.life.MainActivity
2019-03-17 13:42:13.431 19044-19044/com.litets.android.life I/life_tag: onResume()==>>com.litets.android.life.MainActivity
//////点击返回按键
2019-03-17 13:48:36.322 19044-19044/com.litets.android.life I/life_tag: onPause()==>>com.litets.android.life.MainActivity
2019-03-17 13:48:36.797 19044-19044/com.litets.android.life I/life_tag: onStop()==>>com.litets.android.life.MainActivity
2019-03-17 13:48:36.803 19044-19044/com.litets.android.life I/life_tag: onDestroy()==>>com.litets.android.life.MainActivity

基本的生命周期就是这样,没有任何问题。

  • 新建一个Activity,TwoActivity.java
  • 修改MainActivity添加一个Button,点击后可以跳转到TwoActivity,同时修改TwoActivity添加一个Button点击后返回MainActivity。
  • 基本构建完成。

研究

  1. 当点击MainActivity上的按钮,跳转到TwoActivity,是MainActivity先pause,还是TwoActivity先create?
2019-03-17 13:58:13.250 20096-20096/com.litets.android.life I/life_tag: onCreate()==>>com.litets.android.life.MainActivity
2019-03-17 13:58:13.420 20096-20096/com.litets.android.life I/life_tag: onStart()==>>com.litets.android.life.MainActivity
2019-03-17 13:58:13.430 20096-20096/com.litets.android.life I/life_tag: onResume()==>>com.litets.android.life.MainActivity
2019-03-17 13:58:18.737 20096-20096/com.litets.android.life I/life_tag: onPause()==>>com.litets.android.life.MainActivity
2019-03-17 13:58:18.759 20096-20096/com.litets.android.life I/life_tag: onCreate()==>>com.litets.android.life.TwoActivity
2019-03-17 13:58:18.779 20096-20096/com.litets.android.life I/life_tag: onStart()==>>com.litets.android.life.TwoActivity
2019-03-17 13:58:18.809 20096-20096/com.litets.android.life I/life_tag: onResume()==>>com.litets.android.life.TwoActivity
2019-03-17 13:58:19.171 20096-20096/com.litets.android.life I/life_tag: onSaveInstanceState()==>>com.litets.android.life.MainActivity
2019-03-17 13:58:19.173 20096-20096/com.litets.android.life I/life_tag: onStop()==>>com.litets.android.life.MainActivity
**结论
MainActivity: onPause() 
TwoActivity: onCreate()
------------> onStart()
------------> onResume()
MainActivity: onStop() 
显示的先消失新的创建/显示旧的停止/销毁
**

注意:由于Application中的生命周期回调没有onRestart()我们在每个Activity中单独添加输出日志的代码

  1. 当点击返回键后的什么周期变化?
    // 返回键
    2019-03-17 14:04:47.143 20533-20533/com.litets.android.life I/life_tag: onPause()==>>com.litets.android.life.TwoActivity
    2019-03-17 14:04:47.152 20533-20533/com.litets.android.life I/life_tag: onRestart()==>>com.litets.android.life.MainActivity
    2019-03-17 14:04:47.154 20533-20533/com.litets.android.life I/life_tag: onStart()==>>com.litets.android.life.MainActivity
    2019-03-17 14:04:47.156 20533-20533/com.litets.android.life I/life_tag: onResume()==>>com.litets.android.life.MainActivity
    2019-03-17 14:04:47.525 20533-20533/com.litets.android.life I/life_tag: onStop()==>>com.litets.android.life.TwoActivity
    2019-03-17 14:04:47.529 20533-20533/com.litets.android.life I/life_tag: onDestroy()==>>com.litets.android.life.TwoActivity
    
**
结论
TwoActivityonPause()
MainActivity: onRestart()
------------> onStart()
------------> onResume()
TwoActivity: onStop()
------------> onDestroy()
显示的先消失新的显示旧的停止/销毁
**

结论

正常的生命周期总是遵守一个流程:显示的(旧)消失->新的创建/显示->旧的停止/销毁。

声明:原创文章,版权所有,转载请注明出处,https://litets.com。