LaunchMode类型及其应用场景
-
standard,创建一个新的Activity。
-
singleTop,栈顶不是该类型的Activity,创建一个新的Activity。否则,onNewIntent。
-
singleTask,回退栈中没有该类型的Activity,创建Activity,否则,onNewIntent+ClearTop。
注意:
设置了"singleTask"启动模式的Activity,它在启动的时候,会先在系统中查找属性值affinity等于它的属性值taskAffinity的Task存在;如果存在这样的Task,它就会在这个Task中启动,否则就会在新的任务栈中启动。因此, 如果我们想要设置了"singleTask"启动模式的Activity在新的任务中启动,就要为它设置一个独立的taskAffinity属性值。
如果设置了"singleTask"启动模式的Activity不是在新的任务中启动时,它会在已有的任务中查看是否已经存在相应的Activity实例, 如果存在,就会把位于这个Activity实例上面的Activity全部结束掉,即最终这个Activity 实例会位于任务的Stack顶端中。
在一个任务栈中只有一个”singleTask”启动模式的Activity存在。他的上面可以有其他的Activity。这点与singleInstance是有区别的。
- singleInstance,回退栈中,只有这一个Activity,没有其他Activity。
singleTop适合接收通知启动的内容显示页面。
例如,某个新闻客户端的新闻内容页面,如果收到10个新闻推送,每次都打开一个新闻内容页面是很烦人的。
singleTask应用场景:适合作为程序入口点。
例如浏览器的主界面。不管从多少个应用启动浏览器,只会启动主界面一次,其余情况都会走onNewIntent,并且会清空主界面上面的其他页面。
singleInstance应用场景:
闹铃的响铃界面。 你以前设置了一个闹铃:上午6点。在上午5点58分,你启动了闹铃设置界面,并按 Home 键回桌面;在上午5点59分时,你在微信和朋友聊天;在6点时,闹铃响了,并且弹出了一个对话框形式的 Activity(名为 AlarmAlertActivity) 提示你到6点了(这个 Activity 就是以 SingleInstance 加载模式打开的),你按返回键,回到的是微信的聊天界面,这是因为 AlarmAlertActivity 所在的 Task 的栈只有他一个元素, 因此退出之后这个 Task 的栈空了。如果是以 SingleTask 打开 AlarmAlertActivity,那么当闹铃响了的时候,按返回键应该进入闹铃设置界面。
onNewIntent的调用时机
1、该Activity之前已经创建过,也就是执行过了onCreate方法,处于当前应用的任务栈中;
2、该Activity被二次启动,不再调用onCreate方法,而是调用onNewIntent方法;
3、该Activity的LaunchMode不被设置为Standard模式。
更准确的来说,只对SingleTop(且位于栈顶),SingleTask和SingleInstance(且已经在任务栈中存在实例)的情况下,再次启动它们时才会调用,即只对startActivity有效,对仅仅从后台切换到前台而不再次启动的情形,不会触发onNewIntent
该Activity的生命周期变化情况如下:
- (1)LaunchMode为Standard时:
由于每次启动ActivityA都是启动新的实例,和原来启动的没关系,所以不会调用原来ActivityA的onNewIntent方法
- (2)LaunchMode为SingleTop时:Main -> A -> A
如果ActivityA在栈顶,且现在要再启动ActivityA,这时会调用onNewIntent()方法 ,生命周期顺序为:
onCreate--->onStart--->onResume---onPause---自己跳自己--->onNewIntent--->onResume
- (3)LaunchMode为SingleInstance/SingleTask时:
跳转顺序:Main -> A -> B ->A,其中A的LaunchMode被指定。
onCreate--->onStart--->onResume---onPause---跳转B---onStop--->跳转A(自己)--->onRestart--->onStart--->onNewIntent--->onResume
Tips:。activity再启动他的话,他拿到的是之前的那个activity实例,所以说在onnewintent里面只需要处理数据部分。不需要处理布局,界面渲染之前的activity已经做过了。
网友评论