引言
开篇来一个需求:我想启动两个一样的Activity,而且这两个Activity都作为所在task里的topActivity。比如说,我有一个用来浏览文档的Activity,我想在浏览每个文档时都创建一个该Activity的实例,这样我可以在多个文档间切换,该如何实现呢?
答案是: 可以实现。
开篇
作为一个Android开发工程师,工作中未使用过Activity的 android:documentLaunchMode 属性,今天来复习一下这个属性的作用。提到 android:documentLaunchMode,肯定会想到 android:launchMode,那么这两者到底有什么区别呢?它们的使用场景都是怎样的呢?网上貌似也没有太详细的讲解,只能自己看文档了。
【android:documentLaunchMode】 文档
话不多说,先附上一张文档截图
根据文档描述,使用此属性可以让我们一个应用在手机的多进程查看页中出现多个概览屏幕,岂不就是说我可以让一个应用的多项内容在同一个页面或者多个页面上任意切换显示,类似于Windows系统的【Alt + Tab】键。
到此,可以看出和android:launchMode的区别了吧。
关于 【android:launchMode】
我们来复习一下 android:launchMode 的使用及场景
Standard
:
Standard 模式是系统默认的启动模式,一般APP中页面间的正常跳转就是使用的此模式。
SingleTop
:
SingleTop 模式一般常见于社交应用中的通知栏行为功能,例如:App 用户收到几条好友请求的推送消息,需要用户点击推送通知进入到请求者个人信息页,将信息页设置为 SingleTop 模式就可以增强复用性。
SingleTask
:
SingleTask 模式一般用作应用的首页,例如浏览器主页,用户可能从多个应用启动浏览器,但主界面仅仅启动一次,其余情况都会走onNewIntent,并且会清空主界面上面的其他页面。
SingleInstance
:
SingleInstance 模式常应用于独立栈操作的应用【或者说,适合需要与程序分离开的页面, 但是一般应用层使用的很少】,如闹钟的提醒页面,当你在A应用中看视频时,闹钟响了,你点击闹钟提醒通知后进入提醒详情页面,然后点击返回就再次回到A的视频页面,这样就不会过多干扰到用户先前的操作了。
那么这些启动模式无法满足开头说的需求,无论你怎么折腾,在系统的多进程查看页,都只能看到一个页面,无法做到多个页互相切换(备注:除非你打开了一个内置小程序的页面)。
来一张 android:launchMode="singleInstance" 的启动示例:
关于【android:documentLaunchMode】
intoExisting
: activity 会为该document请求一个已经存在的task,这与 设置FLAG_ACTIVITY_NEW_DOCUMENT 且不设置 FLAG_ACTIVITY_MULTIPLE_TASK 有相同的效果
always
:ctivity 会为该document创建一个新的task,即使该document已经被打开了,这与设置 FLAG_ACTIVITY_NEW_DOCUMENT 且设置 FLAG_ACTIVITY_MULTIPLE_TASK 有相同的效果
none
:activity 不会为 document 创建新的task,该app被设置为 single task 的模式,它会重新调用用户唤醒的所有activity中的最近的一个
never
:activity 不会为document创建一个新的task,设置这个值复写了 FLAG_ACTIVITY_NEW_DOCUMENT 和 FLAG_ACTIVITY_MULTIPLE_TASK 标签。如果其中一个标签被设置,并且overview screen 显示该app为
single task 模式。 则该activity 会重新调用用户最近唤醒的activity
注意: none 或 nerver使用时,activity必须设置为 launchMode=”standard” ,如果该属性没有设置,documentLaunchMode=”none” 属性就会被使用。
来一张 android:documentLaunchMode="always" 的使用示例:
最后,使用的时候要添加权限
<uses-permission android:name="android.permission.REORDER_TASKS" />