《Android开发艺术探索》笔记
启动新的Activity之前会先调用旧Activity的onPause()方法,因此在onPause()方法中不要做耗时操作
Activity可能被杀死的情况
- 资源相关的系统配置发生变化。可以通过android:configuration来配置什么情况下不销毁重启Activity,常用属性包括
locale
,oriontation
,keyboardHidden
,即语言资源变化,横竖屏切换,键盘显示或隐藏。此时系统回调onConfigurationChanged(Configuration newConfig)
函数。 - 系统内存不足。系统调用
onSaveInstanceState
->onStop()
->onDestroy()
,在onSaveInstanceState
方法中保存信息;重建时调用,onCreate()
->onStart()
->onRestoreInstanceState
,可以在onCreate
或onRestoreInstancestate
方法中恢复保存的信息。
- 资源相关的系统配置发生变化。可以通过android:configuration来配置什么情况下不销毁重启Activity,常用属性包括
android:launchMode
属性:singleInstance
保证类存在单独的task中并仅存在一个实例,适合与程序分离的页面,如闹钟提醒页面;singleTop
表示类在当前task栈顶时,复用,此时调用onNewInstance
方法,否则新建实例,适合消息通知类activity;singleTask
表示类在当前task栈中存在时,清空在其上面的所有activity实例,直接复用,此时调用onNewInstance
方法,否则新建实例,适合用于程序入口。
android:taskAffinity
属性:- 定义该Activity所属的任务栈,默认为程序的包名。配合
launchMode
为singleTask
时使用
- 定义该Activity所属的任务栈,默认为程序的包名。配合
Activity的Flags
FLAG_ACTIVITY_NEW_TASK
效果等同android:launchMode="singleTask"
FLAG_ACTIVITY_SINGLE_TOP
效果等同android:launchMode="singleTop"
FLAG_ACTIVITY_CLEAR_TOP
清空同一任务栈中在要启动Activity之上的ActivityFLAG_ACTIVITY_EXCLUDE_FROM_RECENTS
不在历史Activity列表中显示,效果等同android:excludeFromRecents="true"
- Activity所在任务栈由其
taskAffinity
属性决定,默认为应用包名。新启动Activity若未指定TaskAffinity
,则置于启动其的Activity所在任务栈的栈顶。非Activity的Context启动的Activity需要指定Flags为FLAG_ACTIVITY_NEW_TASK
,比如从service中启动Activity,即以singleTask方法启动。