一、生命周期
onCreate()
启动 Activity 时,首次创建 Activity 时回调,大多数初始化在该函数内。
onRestart()
当 当前 Activity 重新显示给用户(用户已导航回它)时,在
onStop()
之后调用。之后是onStart()
,然后是onResume()
。
onStart()
首次启动 Activity 时在
onCreate()
之后被回调,再次启动时在onRestart()
之后被回调。此时 Activity 已经可见但还没出现到前台不能与用户交互,通常执行绘制视觉元素、运行动画等操作。
onResume()
在
onStart()
之后被回调,此时 Activity 已经完全可见并且可以与用户交互。
onPause()
当用户返回或者跳转到下一个 Activity 时会回调此方法,表示正在停止当前 Activity,但此时 Activity 依然可见,通常紧接着会回调
onStop()
。
onStop()
表示 Activity 即将停止。
onDestroy()
表示 Activity 被销毁。
值得注意的地方:
onStart
和onResume
咋看起来差不多,但有一些细微的差别,onStart
表示 Activity 虽然此时已经可见但并没有完全显示到前台,onResume
表示此时已经完全显示到前台了,并可以与用户交互了,onPause
和onStop
区别类似于此。
当 ActivityA
启动 ActivityB
时,他们的生命周期方法执行顺序如下:
A.onPause()-->B.onCreate()-->B.onStart()-->B.onResume()-->A.onStop()
1、普通情况下的Activity生命周期方法执行顺序:
启动一个 Activity:
onCreate()-->onStart()-->onResume()
在当前 Activity 中跳转到下一个页面时(或者被用户切换到后台时),当前的 Activity 会被暂停:
onPause()-->onStop()
然后再返回这个 Activity 时:
onRestart()-->onStart()-->onResume()
Activity 退出时:
onPause()-->onStop()-->onDestroy()
2、横竖屏切换时Activity生命周期方法执行顺序:
onPause()-->onSaveInstanceState()-->onStop()-->onDestroy()-->
onCreate()-->onStart()-->onRestoreInstanceState()-->onResume()
在横竖屏切换时 Activity 会先被销毁,然后再重新创建,在销毁时onPause()
被调用之后会调用onSaveInstanceState(Bundle bundle)
,此时我们就有机会将一些需要恢复的信息写入onSaveInstanceState()
的Bundle
参数中。
在 Activity 被重建时,调用onStart()
之后会调用onRestoreInstanceState(Bundle bundle)
,此时我们就可以在onRestoreInstanceState()
用来恢复一些必要的信息,而它的参数就是我们在onSaveInstanceState()
写入的参数。
3、系统内存不足导致低优先级的 Activity 被回收时的生命周期方法执行顺序
此种情况和第二种横竖屏切换时的情况查不多,也会执行onSaveInstanceState()
和onRestoreInstanceState()
。
二、四种启动模式
standard
默认的启动方式,Activity可以被多次实例化,即同一个栈中可以存在多个Activity实例。
如果用ApplicationContext
去启动standard
模式的 Activit y的时候会报错,这是因为此模式的 Activity 默认会进入启动它的 Activity所属的任务栈中,而非 Activity 类型的 Context 并有没有任务栈。
解决办法就是:在用ApplicationContext
启动 Activity 时指定Intent.FLAG_ACTIVITY_NEW_TASK
的Flag
即可,这样在启动 Activity 时就会为它创建一个新栈。
singleTop
栈顶复用模式。以
singleTop
模式启动的 Activity 如果已经有一个实例存在栈顶,那么再启动这个 Activity 时就会重用这个实例,并回调onNewIntent()
方法。如果不在栈顶,则会创建新的实例,效果如standard
一致。
singleTask
栈内复用模式。此模式只允许一个栈中只存在一个该 Activity 的实例,启动此模式的 Activity 时,如果栈中没有该 Activity 的实例,则会创建新的实例。如果栈中已经存在该实例了,系统会销毁在其之上的所有 Activity,最终让该 Activity 实例置于栈顶,并回调
onNewIntent()
方法。
singleInstance
单实例模式。该模式的 Activity 只在一个独立的任务栈中开启,并且这个新的任务栈中有且只有这一个实例。当再次启动该 Activity 实例时,会重用已存在的任务和实例(并调用
onNewIntent()
)。而该 Activity 启动的其他 Activity 会自动运行与另一个任务栈中。
singleInstance
和singleTask
的区别:
singleInstance
在同一个时刻,在系统中只会存在一个实例,而singleTask
模式的 Activity 可以有多个实例,只要这些实例在不同的任务栈中即可。比如应用A启动了一个singleInstance
的 Activity,而应用B也启动了这个 Activity,那么会重用已经启动的实例。
参考文献:
《Android开发艺术探索》
《Android开发进阶从小工到专家》
转载自作者:CodingBlock
出处:http://www.cnblogs.com/codingblock/