Skip to content

Commit 2a0d02b

Browse files
committed
调整Activity全方位解析文章中的细节
1 parent c3b66ec commit 2a0d02b

File tree

1 file changed

+17
-19
lines changed

1 file changed

+17
-19
lines changed

android/basis/activity.md

Lines changed: 17 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,7 @@ onCreate\(\)->onStart\(\)->onResume\(\)->onPause\(\)->onStop\(\)-&gt
5656

5757
在了解这种情况下的生命周期时,首先应该了解这两个回调:**onSaveInstanceState和onRestoreInstanceState**
5858

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。
6060

6161

6262
![](http://upload-images.jianshu.io/upload_images/3985563-23d90471fa7f12d2.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
@@ -145,7 +145,7 @@ Activity的管理是采用任务栈的形式,任务栈采用“后进先出”
145145

146146
**特殊情况,如果在Service或Application中启动一个Activity,其并没有所谓的任务栈,可以使用标记位Flag来解决。解决办法:为待启动的Activity指定FLAG\_ACTIVITY\_NEW\_TASK标记位,创建一个新栈。**
147147

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中,这样就合理的多了。
149149

150150
##### \(2\)栈顶复用模式(singleTop)
151151

@@ -164,26 +164,24 @@ Activity的管理是采用任务栈的形式,任务栈采用“后进先出”
164164

165165
![](http://upload-images.jianshu.io/upload_images/3985563-6378dae7ea249294.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
166166

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中。
172168

173169
##### \(3\)栈内复用模式(singleTask)
174170

175171
该模式是一种单例模式,即一个栈内只有一个该Activity实例。该模式,可以通过在AndroidManifest文件的Activity中指定该Activity需要加载到那个栈中,即singleTask的Activity可以指定想要加载的目标栈。singleTask和taskAffinity配合使用,指定开启的Activity加入到哪个栈中。
176172

177-
```java
173+
``` xml
178174
<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">
182178
</activity>
183179
```
184180

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+
187185
在这种模式下,如果Activity指定的栈不存在,则创建一个栈,并把创建的Activity压入栈内。如果Activity指定的栈存在,如果其中没有该Activity实例,则会创建Activity并压入栈顶,如果其中有该Activity实例,则把该Activity实例之上的Activity杀死清除出栈,重用并让该Activity实例处在栈顶,然后调用onNewIntent\(\)方法。
188186

189187
对应如下三种情况:
@@ -205,7 +203,7 @@ Activity的管理是采用任务栈的形式,任务栈采用“后进先出”
205203

206204

207205

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中。
209207

210208
##### \(4\)单例模式(singleInstance)
211209

@@ -218,11 +216,11 @@ Activity的管理是采用任务栈的形式,任务栈采用“后进先出”
218216

219217

220218

221-
**应用场景:**呼叫来电界面。这种模式的使用情况比较罕见,在Launcher中可能使用。或者你确定你需要使Activity只有一个实例。建议谨慎使用。
219+
**应用场景:** 呼叫来电界面。这种模式的使用情况比较罕见,在Launcher中可能使用。或者你确定你需要使Activity只有一个实例。建议谨慎使用。
222220

223221
### 3.特殊情况——前台栈和后台栈的交互
224222

225-
假如目前有两个任务栈。前台任务栈为AB,后台任务栈为CD,这里假设CD的启动模式均为singleTask,现在请求启动D,那么这个后台的任务栈都会被切换到前台,这个时候整个后退列表就变成了ABCD。当用户按back返回时,列表中的activity会一一出栈,如下图。
223+
假如目前有两个任务栈。前台任务栈为AB,后台任务栈为CD,这里假设CD的启动模式均为singleTask,现在请求启动D,那么这个后台的任务栈都会被切换到前台,这个时候整个后退列表就变成了ABCD。当用户按back返回时,列表中的activity会一一出栈,如下图。
226224

227225

228226
![](http://upload-images.jianshu.io/upload_images/3985563-4aeb1947bba27e44.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
@@ -246,12 +244,12 @@ Activity的管理是采用任务栈的形式,任务栈采用“后进先出”
246244

247245
Activity的Flags很多,这里介绍集中常用的,用于设定Activity的启动模式。可以在启动Activity时,通过Intent的addFlags\(\)方法设置。
248246

249-
**\(1\)FLAG\_ACTIVITY\_NEW\_TASK**
247+
**\(1\)FLAG\_ACTIVITY\_NEW\_TASK**
250248
其效果与指定Activity为singleTask模式一致。
251249

252-
**\(2\)FLAG\_ACTIVITY\_SINGLE\_TOP**
250+
**\(2\)FLAG\_ACTIVITY\_SINGLE\_TOP**
253251
其效果与指定Activity为singleTop模式一致。
254252

255-
**\(3\)FLAG\_ACTIVITY\_CLEAR\_TOP**
253+
**\(3\)FLAG\_ACTIVITY\_CLEAR\_TOP**
256254
具有此标记位的Activity,当它启动时,在同一个任务栈中所有位于它上面的Activity都要出栈。如果和singleTask模式一起出现,若被启动的Activity已经存在栈中,则清除其之上的Activity,并调用该Activity的onNewIntent方法。如果被启动的Activity采用standard模式,那么该Activity连同之上的所有Activity出栈,然后创建新的Activity实例并压入栈中。
257255

0 commit comments

Comments
 (0)