Android生命周期方法是贯穿Android 程序运行始末的核心方法。Activity,Service,Fragment等一系列的Android核心组件,生命周期方法贯穿始终。但我在最近的面试中,发现很多从事android 原生开发2、3年的从业者居然连跳转的执行顺序都不能肯定,准确的说出来。所以就准备了这么一篇十分初级的问题作为本人技术文章的初片(‘第一次’就这么交代了)。下面我仅以Activity为例,描述下生命周期方法掉用的顺序和应注意的一些事宜。
首先我们先看一张Activity标准的生命周期图:
Activity作为Android 使用最多的组件,它的生命周期方法也是android coder信手拈来的基础基础。 众所周知周知,Android Activity的生命周期方法,onCreate(); onStart(); onResume(); onPause(); onStop(); onRestart(); onDestroy(); 7大方法。下面结合demo的日志输出,来准确的定位每个方法的执行位置和执行顺序。
Activity启动顺序执行onCreate();、onStart();、onResume();方法。通过Android Developer官网可以准确的了解到onCreate();方法在Activity生命周期内只能执行一次,onStart();方法是用户可以看到当前Activity的状态变化回调,该状态下Activity 变更为交互化。onResume();方法是用户可以和当前Activity交互,及当前页面位于活动栈顶部。上述三个方法是 Activity启动必然顺序执行的3个方法。
在onResume();方法后,用户即可以和Activity进行页面操作交互。实现跳转,输入等一系列交互事件,在界面跳转和前后台切换中会触发Activity其他几个生命周期方法,下面就来逐个介绍。
onPause();该方法在Android 官网上描述为当前activity失去焦点,导致 Activity 暂停。例如:半透明Activity展示,Activity跳转。但是要特别注意的是:在Android 7.0的多窗口模式下运行时,仅有一个应用随时具备焦点;系统将暂停所有其他应用。该方法一般用于处理不应该在暂停状态下的继续执行的操作,或者需要将状态变化前的数据进行持久化存储。如:视频的状态处理。
onStop();该方法在当前Activity对用户不可见时调用, 您接下来将收到onRestart(),onDestroy()或什么都没有,具体取决于以后的用户活动。其和onPause();方法的区别是该页面完全不可见时回掉,一个透明或者半透明activity 覆盖在当前Activity时,该方法不会被调用。
onRestart();当当前Activity被重新显示给用户时会调用该方法,该方法时在onStop();之后调用,然后是onStart();然后是onResume();
onDestroy();在销毁活动之前执行最终的清理,该方法一般是我们调用了finish();方法或者当前Activity 被系统暂时销毁2种情况。我们在该方法中处理好我们的数据和资源调用,解决内存泄漏等一些影响性能的问题。
下面我们来看一下App启动 通过系统Launcher进程,通知AMS(Activity Manager Service)启动对应点击App的启动Activity,也就是其在AndroidManifest.xml中设置的启动Activity。下面来看下demo输出的日志:
2019-03-26 15:31:37.749 27331-27331/com.zjp.test E/ZJP: onCreate: -------------MainActivity
2019-03-26 15:31:13.147 3755-3755/com.zjp.test E/ZJP: onStart ------------- MainActivity
2019-03-26 15:31:13.153 3755-3755/com.zjp.test E/ZJP: onResume ------------- MainActivity
接下来 我们进行跳转操作, 在MainActivity 点击Button 跳转SecondActiviy中 demo输出的日志:
2019-03-26 16:31:37.749 27331-27331/com.zjp.test E/ZJP: onPause --------- MainActivity
2019-03-26 16:31:37.794 27331-27331/com.zjp.test E/ZJP: onCreate: --------- SecondActivity
2019-03-26 16:31:37.795 27331-27331/com.zjp.test E/ZJP: onStart --------- SecondActivity
2019-03-26 16:31:37.799 27331-27331/com.zjp.test E/ZJP: onResume --------- SecondActivity
2019-03-26 16:31:38.136 27331-27331/com.zjp.test E/ZJP: onStop --------- MainActivity
需要注意的是:MainActivity 的onStop();方法是在SecondActivity的onResume();方法执行后才调用的。
继续操作,我们在SecondActivity 中放置一个Button,点击调用finish();方法。其日志输出如下:
2019-03-26 16:32:38.136 27331-27331/com.zjp.test E/ZJP: onPause ---------- SecondActivity
2019-03-26 16:32:38.219 27331-27331/com.zjp.test E/ZJP: onRestart ------------- MainActivity
2019-03-26 16:32:38.220 27331-27331/com.zjp.test E/ZJP: onStart ------------- MainActivity
2019-03-26 16:32:38.221 27331-27331/com.zjp.test E/ZJP: onResume ----------- MainActivity
2019-03-26 16:32:38.551 27331-27331/com.zjp.test E/ZJP: onStop ----------- SecondActivity
2019-03-26 16:32:38.551 27331-27331/com.zjp.test E/ZJP: onDestroy ---------- SecondActivity
其执行过程,先执行了SecondActivity的onPause();方法,然后是执行了MainActivity的onRestart();、onStart();、onResume();方法,最后又执行SecondActivity的onStop();和onDestroy();方法,完成了SecondActivity的销毁。
最后,该问题很简单,但是又是android原生Activity执行的根基,在招聘过程中,问了多个从业人员,感觉回答的都很没有底气。所以简单的完成了一个demo阐述说明下,androidActivity跳转生命周期方法执行顺序。本人文笔拙劣,构词不严谨,若有不当,希望各位道友不吝赐教。