您的位置:首页 > 移动开发 > Android开发

Android组件-Activity生命周期与回调机制

2014-05-19 15:56 344 查看
熟悉Activity,属于Android开发的基本要求,理解好Activity的回调,才可以算得上了解Activity,至于Activity的其他特性,则需要更多的时间去掌握。

本文主要针对Activity的回调做个说明,接下来就先从Activity为我们提供了7个主要的回调方法开始,进行详细的介绍:

public class Activity extends ApplicationContext {
protected void onCreate(Bundle savedInstanceState);

protected void onStart();

protected void onRestart();

protected void onResume();

protected void onPause();

protected void onStop();

protected void onDestroy();
}


这7个方法之间存在一定的顺序关系,我们先看下图:(注意,非全屏不透明的断句要断在非后面,也就是“非”“全屏不透明”的意思)



从上图我们可以总结几个关键点:

1. onCreate -> onStart -> onResume ,执行了onCreate必然会执行接下来的onStart -> onResume,执行了onStart必然会执行接下来的onResume。

2. onPause与onResume之间存在小循环,这个小循环能生效的前提是需要启动一个非全屏不透明的Activity(注意:非全屏不透明的断句要断在非后面,也就是“非”“全屏不透明”的意思)。那什么是非全屏不透明呢?没有全屏或者半透明的样式,都属于非全屏不透明的范畴。举两个例子,当Activity是一个Dialog样式,就是非全屏了;当透过新的Activity还可以看到旧Activity的时候,就是半透明了。在启动和关闭这种非全屏不透明的Activity时,系统就会且仅会回调onPause->onResume,而不会走到onStop->onStart。

3. 我们可以归纳一个回调次数的大小关系,onResume >= onPause >= onStart >= onStop >= onCreate >= onDestroy。为什么是大于等于呢?很有可能,这个Activity只是完整滴走过了每一个回调就完成他的使命了,因此是大于等于。至于onRestart,基本可以用onStart取代,就不加入排序了。

4. 由于onStart,onResume,onPause,onStop等存在多次调用的可能,应当尽量减少耗时操作

5. 可以在onCreate和onDestroy,onStart和onStop,onResume和onPause之间任意选择一组,进行正反两个动作。该如何选择有一些基本准则,但更多时候需要根据实际情况判断:

a). 正反两个操作对系统资源消耗较少,如注册和反注册广播,一般选择onCreate和onDestroy

b). 对系统消耗较大,如动画,重力感应器等,一般选择onStart和onStop来开启和关闭

c). 对状态很敏感的操作,如一些关键开关变量的控制,状态值的校对等,可以选择onResume和onPause

d). 需要特别指出的是关于资源文件的操作,比如数据库,文件IO等,一定不要放在以上任意一组中进行,应当养成良好的习惯,对资源文件的操作及时关闭。

6. Android对于Activity的跳转采用展示优先原则,优先调用新Activity(当前可见Activity)负责显示的api如onCreate,onStart,onResume,然后再调用旧Activity(当前不可见Activity)负责暂停关闭等操作的api如onPause,onStop,onDestroy。

7. 根据6的原则,假如从FirstActivity 跳转到 SecondActivity,回调的顺序是SecondActivity的onCreate -> onStart -> onResume,然后才到FirstActivity的onPause -> onStop -> onDestroy。

8. onDestroy只有在显式调用该Activity的finish方法或者由于内存原因被系统回收时才回调,如果只是context.startActivity等方式启动一个新的Activity,系统是不会马上回调旧Activity的onDestroy方法的。

9. 结合第8点以及上图的生命周期示意图,做一个比较有趣的总结,在Activity各个时期执行finish的路线图:

1. onCreate 时调用 finish
将会 onCreate --> onDestory

2. onStart 时调用 finish
将会
onCreate --> onStart --> onStop --> onDestory

3. onResume 时调用 finish
将会
onCreate --> onStart--> onResume --> onPause --> onStop --> onDestory

4. onPause 时调用 finish
将会
onCreate --> onStart --> onResume --> onPause --> onStop --> onDestory

5. onStop 时调用 finish
将会
onCreate --> onStart --> onResume --> onPause --> onStop --> onDestory

6. onDestory 时调用 finish
将会
onCreate --> onStart --> onResume --> onPause --> onStop --> onDestory


综上,Activity生命周期中关键API的关键信息基本介绍清楚了,在Activity的所有系统回调API中还有两个比较常见的,在此简单介绍一下。

1. 首先是onActivityResult,大家应该都比较熟悉,比如在FirstActivity调用了this.startActivityForResult,那SecondActivity可以setResult,把数据返回给FirstActivity.onActivityResult来处理。

2. 相对比较陌生的是onNewIntent,当Activity声明为singleTask或者singleInstance的时候,如果这个Activity已经启动,那么再次启动该Activity的时候会走到onNewIntent。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: