android:launchMode

参考
Activity launchmode 应用场景
Android Activity 启动模式详解

在看LaunchMode之前先理解一下Task。task是一个stack(栈),”Last in, First out”。一个task包含了一组activity实例。 一般情况下,当用户打开一个新的app的时候一个新的task就被创建了,第一个打开的activity被叫做task的root。安卓系统可以同时运行很多个 task,但是只有一个task在前台。

Mainfest.xml
<activity android:launchMode = "singleTask"……

  • standard
    默认模式,每次启动都会创建新的实例,onCreate,onStart,onResume都会被调用。谁启动了这个Activity,这个Activity就运行在启动它的那个Activity所在的栈中。

  • SingleTop
    如果已经位于栈顶,则不会被创建,onCreate,onStart并不会被调用。如果不在栈顶,仍然会新创建。
    应用场景:网易资讯。 假设主界面为 MainActivity,显示资讯的界面是 DetailActivity,显然显示任何一条资讯都会使用 DetailActivity,即把资讯内容通过 Intent 传给 DetailActivity 就可以了。 假设你正在看资讯1(即在 DetailActivity),此时手机收到服务器的推送:收到一条通知(资讯2),点击通知就会跳转到 DetailActivity 并显示资讯2,当你点击通知时,因为目前栈顶的 Activity 就是 DetailActivity,因此这里就是使用 SingleTop 的地方,即点击通知后以 SingleTop 加载模式打开 DetailActivity 并显示资讯2,因此资讯1的 DetailActivity 就被覆盖掉了。 此后你点击返回键会回到主界面。

  • SingleTask
    如果不在栈顶,会把所有上面的全部出栈。
    应用场景:微信的主界面(一般应用主界面都会以 SingleTask 启动)。 你打开微信主界面(在栈的最底部)后,进入朋友圈(在栈的顶部),此时你点击 Home 键回桌面,并打开网易资讯。 假设你想将网易资讯的一条资讯分享给微信好友,那么就按照 分享->微信->好友A->分享给他->留在微信。接着会跳转微信的主界面,即不是你原本所在的朋友圈,并且微信的栈只剩下一个元素:主界面的 Activity。这里就使用了 SingleTask(即以 SingleTask 加载模式打开微信主界面)。
    再举一个例子,Android系统内置的浏览器程序声明自己浏览网页的Activity始终应该在一个独立的任务当中打开, 也就是通过在元素中设置"singleTask"启动模式来实现的。这意味着,当你的程序准备去打开Android内置浏览器的时候, 新打开的Activity并不会放入到你当前的任务中,而是会启动一个新的任务。而如果浏览器程序在后台已经存在一个任务了,则会把这个任务切换到前台。

  • SingleInstance
    将一个Activity的launchMode设置为该值时,表明这个Activity独自占用一个任务队列,这个队列中不让在加入其他的Activity。 系统不会向声明成”singleInstance”的Activity所在的任务当中再添加其它Activity。 也就是说,这种Activity所在的任务中始终只会有一个Activity,通过这个Activity再打开的其它Activity也会被放入到别的任务当中。
    应用场景:闹铃的响铃界面。 你以前设置了一个闹铃:上午6点。在上午5点58分,你启动了闹铃设置界面,并按 Home 键回桌面;在上午5点59分时,你在微信和朋友聊天; 在6点时,闹铃响了,并且弹出了一个对话框形式的 Activity(名为 AlarmAlertActivity) 提示你到6点了(这个 Activity 就是以 SingleInstance 加载模式打开的),你按返回键,回到的是微信的聊天界面,这是因为 AlarmAlertActivity 所在的 Task 的栈只有他一个元素, 因此退出之后这个 Task 的栈空了。如果是以 SingleTask 打开 AlarmAlertActivity,那么当闹铃响了的时候,按返回键应该进入闹铃设置界面。

推荐阅读更多精彩内容