17的时候为了学习买了这本书,之前看过一遍。但是记忆不是很牢固。最近又重新看了一遍,把自己的笔记发出来,以后在想看的时候也能直接看看。也希望能给别人一些帮助
1.1 Activity生命周期全面分析
Android的生命周期主要分两部分 一种是正常情况下的生命周期,我们也比较熟悉这一部分,另一部分是异常情况下,主要是Activity被系统回收或者由于当前设备的Configuration改变导致Activity被销毁重建。
1.1.1典型情况下的生命周期分析
正常情况下Activity 会经历如下生命周期
-
onCreate:表示Activity正在创建,也是生命周期的第一个方法,一般在这个方法中 做一些初始化的工作。
-
onRestart:表示Activity正在重新启动,一般当前Activity由不可见变为可见时,系统就会调用onRestart方法比如用户从桌面再次进入到当前页面。
-
onStart:表示Activity正在被启动,这时Activity已经可见了,但是没有出现在前台,无法和用户交互。
-
onResume:表示Activity已经可以看见了,出现在前台并开始活动。 (onStart和onResume都表示Activity已经可见了但是onStart的时候Activity还在后台,onResume时才显示到前台)。
-
onPause:表示Activity正在停止,我们可以在这个方法中做一些轻量的回收操作,比如存储一些数据,停止动画等操作,但是不能太耗时,否则会影响新的Activity的显示
-
onStop:表示Activity 即将停止,我们可以做一些稍微重量的回收工作,但时同样不能太耗时。
-
onDestrory:表示Activity即将被销毁。这时activity生命周期的最后一个回调,我们在这里可以做一些回收工作和资源的释放。
Activity各种生命周期的切换过程。
- Activity 第一次启动时,回调如下: onCreate→onStart→onResume,
02-11 18:44:00.186 9438-9438/com.caoxiaoxu.test D/--TestActivity1: onCreate
02-11 18:44:00.196 9438-9438/com.caoxiaoxu.test D/--TestActivity1: onStart
02-11 18:44:00.196 9438-9438/com.caoxiaoxu.test D/--TestActivity1: onResume
- 当用户打开新的Activity,或者切换到桌面时 回调如下 onPause →onStop ,
02-11 18:45:23.226 9438-9438/com.caoxiaoxu.test D/--TestActivity1: onPause
02-11 18:45:23.756 9438-9438/com.caoxiaoxu.test D/--TestActivity1: onStop
- 当用户再次回到原 Activity时,回调如下 onRestart →onStart→ onResume
02-11 18:45:55.516 9438-9438/com.caoxiaoxu.test D/--TestActivity1: onRestart
02-11 18:45:55.516 9438-9438/com.caoxiaoxu.test D/--TestActivity1: onStart
02-11 18:45:55.516 9438-9438/com.caoxiaoxu.test D/--TestActivity1: onResume
- 当用户按bask键回退时,回调如下:onPause→onStop→onDestroy
02-11 18:46:57.086 9438-9438/com.caoxiaoxu.test D/--TestActivity1: onPause
02-11 18:46:57.476 9438-9438/com.caoxiaoxu.test D/--TestActivity1: onStop
02-11 18:46:57.476 9438-9438/com.caoxiaoxu.test D/--TestActivity1: onDestroy
- 在TestActivity1中打开TestActivity2回调如下 TestActivity1 的onPause →B的onCreate →onStart→onResume →TestActivity1的onStop
02-11 18:48:03.216 9438-9438/com.caoxiaoxu.test D/--TestActivity1: onPause
02-11 18:48:03.216 9438-9438/com.caoxiaoxu.test D/--TestActivity2: onCreate
02-11 18:48:03.216 9438-9438/com.caoxiaoxu.test D/--TestActivity2: onStart
02-11 18:48:03.216 9438-9438/com.caoxiaoxu.test D/--TestActivity2: onResume
02-11 18:48:03.636 9438-9438/com.caoxiaoxu.test D/--TestActivity1: onStop
- 在TestActivity2中返回TestActivity1回调如下 TestActivity2的onPause →TestActivity1的onRestart→onStart→onResume →TestActivity1的onStop →onDestroy
02-11 18:48:15.536 9438-9438/com.caoxiaoxu.test D/--TestActivity2: onPause
02-11 18:48:15.536 9438-9438/com.caoxiaoxu.test D/--TestActivity1: onRestart
02-11 18:48:15.536 9438-9438/com.caoxiaoxu.test D/--TestActivity1: onStart
02-11 18:48:15.536 9438-9438/com.caoxiaoxu.test D/--TestActivity1: onResume
02-11 18:48:15.966 9438-9438/com.caoxiaoxu.test D/--TestActivity2: onStop
02-11 18:48:15.966 9438-9438/com.caoxiaoxu.test D/--TestActivity2: onDestroy
1.1.2异常情况下的生命周期分析
情况1:资源相关的系统配置发生改变导致Activity被杀死并重新创建
- 销毁:
例屏幕旋转时,系统会调用onSeveInstanceState来保存状态,该方法调用顺序是onStop之前 可能在onPause之前调用 也可能是在此方法之后调用。
onSeveInstanceState方法只会在Activity异常情况下调用,手动关闭此Activity并不会调用。
-创建:
Activity重新创建时系统会调用onRestoreInstanceState,并把销毁时onSeveInstanceState保存的Bundle作为参数传递给onRestoreInstanceState和onCreate。我们可以在onRestoreInstanceState和onCreate判断Activity是否被重新创建,并且赋值。onRestoreInstanceState的调用时机是onStart之后
onRestoreInstanceState被调用Bundle一定是有值的,但onCreate如果是正常启动的话其Bundle参数是null,所以我们要加额外判断,所以官方文档的建议是采用onRestorteInstanceState来恢复数据。
- 配置发生改变时Activity如何不被重新创建
当系统配置改变时,Activity会被重新创建,如何不被重新创建呢?我们可以给Activity指定configChanges属性,如屏幕旋转时我们使用
android:configChanges="orientation|screenSize"
此时Activity不会被重新创建了,而会调用onConfigurationChanged方法
情况2:资源内存不足导致优先级低的Activity被杀死
其数据存储和恢复的过程和情况1一致
- Activity优先级排序
1.前台Activity----正在和用户交互的Activity,其优先权最高
2.可见但非前台Activity---比如Activity中弹出对话框,导致其可见但无法交互。
3.后台Activity---已经被暂停的Activity,如执行了onStop方法。其优先级最低
1.2Activity启动模式
任务栈是一种后进先出的栈结构
Activity的启动模式
- standard:标准模式,系统和默认的启动模式。每次启动Activity都会创建一个新的实例。
standard模式下 谁启动了Activity ,Activity就用运行在他所在的栈中,所以ApplicationContext去启动standard的activity会报错。因为Android 的Context没有任务栈,
-
singleTop:栈顶复用模式。如果处于栈顶不会被创建,并调用onNewIntent(intent)
-
singleTask:栈内复用模式。这是一种单例模式。只要该Activity在一个任务栈中存在,都不会重新创建,并回调onNewIntent(intent)方法。如果不存在,系统会先寻找是否存在需要的栈,如果不存在该栈,就创建一个任务栈,并把该Activity放进去;如果存在,就会创建到已经存在的栈中。
-
singleInstance:单例模式,是一种加强版的singleTask,此模式的Activity 会单独位于一个任务栈中。
Activity的Flags
- FLAG_ACTIVITY_SINGLE_TOP:对应singleTop启动模式。
- FLAG_ACTIVITY_NEW_TASK :对应singleTask模式。
1.3 IntentFilter的匹配规则
- action 匹配规则
Intent 中的action必须和过滤规则中的action匹配,字符串的值完全一样
注:Intent中必须有且匹配成功 - category
Intent中的category必须和某个category相同,但是可以不传值,因为startActivity和staryActivityForResult时会默认为Intent加上< category android:name="android.intent.category.DEAFAULT" />
网友评论