@@ -56,7 +56,7 @@ onCreate\(\)->onStart\(\)->onResume\(\)->onPause\(\)->onStop\(\)->
56
56
57
57
在了解这种情况下的生命周期时,首先应该了解这两个回调:** onSaveInstanceState和onRestoreInstanceState** 。
58
58
59
- 在Activity由于异常情况下终止时,系统会调用onSaveInstanceState来保存当前Activity的状态。这个方法的调用是在onStop之前,它和onPause没有既定的时序关系,该方法只在Activity被异常终止的情况下调用。当异常终止的Activity被重建以后,系统会调用onRestoreInstanceState,并且把Activity销毁时onSaveInstanceState方法所保存的Bundle对象参数同时传递给onRestoreInstanceState和onCreate方法。因此,可以通过onRestoreInstanceState方法来恢复Activity的状态,该方法的调用时机是在onStart之后。** 其中onCreate和onRestoreInstanceState方法来恢复Activity的状态的区别:** onRestoreInstanceState回调则表明其中Bundle对象非空,不用加非空判断。onCreate需要非空判断。建议使用onRestoreInstanceState。
59
+ 在Activity由于异常情况下终止时,系统会调用onSaveInstanceState来保存当前Activity的状态。这个方法的调用是在onStop之前,它和onPause没有既定的时序关系,该方法只在Activity被异常终止的情况下调用。当异常终止的Activity被重建以后,系统会调用onRestoreInstanceState,并且把Activity销毁时onSaveInstanceState方法所保存的Bundle对象参数同时传递给onRestoreInstanceState和onCreate方法。因此,可以通过onRestoreInstanceState方法来恢复Activity的状态,该方法的调用时机是在onStart之后。** 其中onCreate和onRestoreInstanceState方法来恢复Activity的状态的区别:** onRestoreInstanceState回调则表明其中Bundle对象非空,不用加非空判断。onCreate需要非空判断。建议使用onRestoreInstanceState。
60
60
61
61
62
62
![ ] ( http://upload-images.jianshu.io/upload_images/3985563-23d90471fa7f12d2.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240 )
@@ -145,7 +145,7 @@ Activity的管理是采用任务栈的形式,任务栈采用“后进先出”
145
145
146
146
** 特殊情况,如果在Service或Application中启动一个Activity,其并没有所谓的任务栈,可以使用标记位Flag来解决。解决办法:为待启动的Activity指定FLAG\_ ACTIVITY\_ NEW\_ TASK标记位,创建一个新栈。**
147
147
148
- ** 应用场景:** 绝大多数Activity。如果以这种方式启动的Activity被跨进程调用,在5.0之前新启动的Activity实例会放入发送Intent的Task的栈的顶部,尽管它们属于不同的程序,这似乎有点费解看起来也不是那么合理,所以在5.0之后,上述情景会创建一个新的Task,新启动的Activity就会放入刚创建的Task中,这样就合理的多了。
148
+ ** 应用场景:** 绝大多数Activity。如果以这种方式启动的Activity被跨进程调用,在5.0之前新启动的Activity实例会放入发送Intent的Task的栈的顶部,尽管它们属于不同的程序,这似乎有点费解看起来也不是那么合理,所以在5.0之后,上述情景会创建一个新的Task,新启动的Activity就会放入刚创建的Task中,这样就合理的多了。
149
149
150
150
##### \( 2\) 栈顶复用模式(singleTop)
151
151
@@ -164,26 +164,24 @@ Activity的管理是采用任务栈的形式,任务栈采用“后进先出”
164
164
165
165
![ ] ( http://upload-images.jianshu.io/upload_images/3985563-6378dae7ea249294.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240 )
166
166
167
-
168
-
169
-
170
-
171
- ** 应用场景:** 在通知栏点击收到的通知,然后需要启动一个Activity,这个Activity就可以用singleTop,否则每次点击都会新建一个Activity。当然实际的开发过程中,测试妹纸没准给你提过这样的bug:某个场景下连续快速点击,启动了两个Activity。如果这个时候待启动的Activity使用 singleTop模式也是可以避免这个Bug的。同standard模式,如果是外部程序启动singleTop的Activity,在Android 5.0之前新创建的Activity会位于调用者的Task中,5.0及以后会放入新的Task中。
167
+ ** 应用场景:** 在通知栏点击收到的通知,然后需要启动一个Activity,这个Activity就可以用singleTop,否则每次点击都会新建一个Activity。当然实际的开发过程中,测试妹纸没准给你提过这样的bug:某个场景下连续快速点击,启动了两个Activity。如果这个时候待启动的Activity使用 singleTop模式也是可以避免这个Bug的。同standard模式,如果是外部程序启动singleTop的Activity,在Android 5.0之前新创建的Activity会位于调用者的Task中,5.0及以后会放入新的Task中。
172
168
173
169
##### \( 3\) 栈内复用模式(singleTask)
174
170
175
171
该模式是一种单例模式,即一个栈内只有一个该Activity实例。该模式,可以通过在AndroidManifest文件的Activity中指定该Activity需要加载到那个栈中,即singleTask的Activity可以指定想要加载的目标栈。singleTask和taskAffinity配合使用,指定开启的Activity加入到哪个栈中。
176
172
177
- ``` java
173
+ ``` xml
178
174
<activity android : name =" .Activity1"
179
- android: launchMode= " singleTask"
180
- android: taskAffinity= " com.lvr.task"
181
- android: label= " @string/app_name" >
175
+ android:launchMode=" singleTask"
176
+ android:taskAffinity=" com.lvr.task"
177
+ android:label=" @string/app_name" >
182
178
</activity >
183
179
```
184
180
185
- ** 关于taskAffinity的值:** 每个Activity都有taskAffinity属性,这个属性指出了它希望进入的Task。如果一个Activity没有显式的指明该Activity的taskAffinity,那么它的这个属性就等于Application指明的taskAffinity,如果Application也没有指明,那么该taskAffinity的值就等于包名。
186
- ** 执行逻辑:**
181
+ ** 关于taskAffinity的值:** 每个Activity都有taskAffinity属性,这个属性指出了它希望进入的Task。如果一个Activity没有显式的指明该Activity的taskAffinity,那么它的这个属性就等于Application指明的taskAffinity,如果Application也没有指明,那么该taskAffinity的值就等于包名。
182
+
183
+ ** 执行逻辑:**
184
+
187
185
在这种模式下,如果Activity指定的栈不存在,则创建一个栈,并把创建的Activity压入栈内。如果Activity指定的栈存在,如果其中没有该Activity实例,则会创建Activity并压入栈顶,如果其中有该Activity实例,则把该Activity实例之上的Activity杀死清除出栈,重用并让该Activity实例处在栈顶,然后调用onNewIntent\(\) 方法。
188
186
189
187
对应如下三种情况:
@@ -205,7 +203,7 @@ Activity的管理是采用任务栈的形式,任务栈采用“后进先出”
205
203
206
204
207
205
208
- ** 应用场景:** 大多数App的主页。对于大部分应用,当我们在主界面点击回退按钮的时候都是退出应用,那么当我们第一次进入主界面之后,主界面位于栈底,以后不管我们打开了多少个Activity,只要我们再次回到主界面,都应该使用将主界面Activity上所有的Activity移除的方式来让主界面Activity处于栈顶,而不是往栈顶新加一个主界面Activity的实例,通过这种方式能够保证退出应用时所有的Activity都能报销毁。在跨应用Intent传递时,如果系统中不存在singleTask Activity的实例,那么将创建一个新的Task,然后创建SingleTask Activity的实例,将其放入新的Task中。
206
+ ** 应用场景:** 大多数App的主页。对于大部分应用,当我们在主界面点击回退按钮的时候都是退出应用,那么当我们第一次进入主界面之后,主界面位于栈底,以后不管我们打开了多少个Activity,只要我们再次回到主界面,都应该使用将主界面Activity上所有的Activity移除的方式来让主界面Activity处于栈顶,而不是往栈顶新加一个主界面Activity的实例,通过这种方式能够保证退出应用时所有的Activity都能报销毁。在跨应用Intent传递时,如果系统中不存在singleTask Activity的实例,那么将创建一个新的Task,然后创建SingleTask Activity的实例,将其放入新的Task中。
209
207
210
208
##### \( 4\) 单例模式(singleInstance)
211
209
@@ -218,11 +216,11 @@ Activity的管理是采用任务栈的形式,任务栈采用“后进先出”
218
216
219
217
220
218
221
- ** 应用场景:** 呼叫来电界面。这种模式的使用情况比较罕见,在Launcher中可能使用。或者你确定你需要使Activity只有一个实例。建议谨慎使用。
219
+ ** 应用场景:** 呼叫来电界面。这种模式的使用情况比较罕见,在Launcher中可能使用。或者你确定你需要使Activity只有一个实例。建议谨慎使用。
222
220
223
221
### 3.特殊情况——前台栈和后台栈的交互
224
222
225
- 假如目前有两个任务栈。前台任务栈为AB,后台任务栈为CD,这里假设CD的启动模式均为singleTask,现在请求启动D,那么这个后台的任务栈都会被切换到前台,这个时候整个后退列表就变成了ABCD。当用户按back返回时,列表中的activity会一一出栈,如下图。
223
+ 假如目前有两个任务栈。前台任务栈为AB,后台任务栈为CD,这里假设CD的启动模式均为singleTask,现在请求启动D,那么这个后台的任务栈都会被切换到前台,这个时候整个后退列表就变成了ABCD。当用户按back返回时,列表中的activity会一一出栈,如下图。
226
224
227
225
228
226
![ ] ( http://upload-images.jianshu.io/upload_images/3985563-4aeb1947bba27e44.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240 )
@@ -246,12 +244,12 @@ Activity的管理是采用任务栈的形式,任务栈采用“后进先出”
246
244
247
245
Activity的Flags很多,这里介绍集中常用的,用于设定Activity的启动模式。可以在启动Activity时,通过Intent的addFlags\(\) 方法设置。
248
246
249
- ** \( 1\) FLAG\_ ACTIVITY\_ NEW\_ TASK**
247
+ ** \( 1\) FLAG\_ ACTIVITY\_ NEW\_ TASK**
250
248
其效果与指定Activity为singleTask模式一致。
251
249
252
- ** \( 2\) FLAG\_ ACTIVITY\_ SINGLE\_ TOP**
250
+ ** \( 2\) FLAG\_ ACTIVITY\_ SINGLE\_ TOP**
253
251
其效果与指定Activity为singleTop模式一致。
254
252
255
- ** \( 3\) FLAG\_ ACTIVITY\_ CLEAR\_ TOP**
253
+ ** \( 3\) FLAG\_ ACTIVITY\_ CLEAR\_ TOP**
256
254
具有此标记位的Activity,当它启动时,在同一个任务栈中所有位于它上面的Activity都要出栈。如果和singleTask模式一起出现,若被启动的Activity已经存在栈中,则清除其之上的Activity,并调用该Activity的onNewIntent方法。如果被启动的Activity采用standard模式,那么该Activity连同之上的所有Activity出栈,然后创建新的Activity实例并压入栈中。
257
255
0 commit comments