Activity四种启动模式的利用场景

来源:互联网 发布:linux 压缩文件夹 gz 编辑:程序博客网 时间:2024/06/16 08:58

一.singleTask:

需求说明: 如果自己的客户端处于运行状态,按下Home键后台挂起。此时如果使用微信调起自己的客户端某 个页面,不做任何处理的情况下,按下回退或者当前 Activity.finish(),页面都会停留在自己的客户端(因为自己的Application回 退栈不为空),这明显不符合逻辑的。产品的要求 是,回退必须回到微信客户端,而且要保证不杀死自己的Application.

处理方案: 设置当前 被调起Activity的属性 为:LaunchMode=""SingleTask"  taskAffinity="com.tencent.mm"(com.tencent.mm 是借助于工具找到的微信包名),就是把自己的 Activity放到微信默认的Task栈里面,这样回退时就会遵循“Task只要有Activity一定 从本Task剩余Activity回退"的原 则,不会回到自己的客户端,而且也不会影响自己客户端本来的Activity和Task逻辑。

 

其他:

创 建两个工程application1和application2,分别含有Activity1和Activity2,其taskAffinity相 同,Activity1的allowTaskReparenting为true。首先,我们启动application1,加载Activity1,然后 按Home键,使该task(假设为task1)进入后台。然后启动application2,默认加载Activity2。我们看到了什么现象?没错, 本来应该是显示Activity2,但是我们却看到了Activity1。实际上Activity2也被加载了,只是Activity1重新宿主,所以看 到了Activity1。


我们首先启动APP1的MyActivity,然后按Home键,返回到桌面,然后打开APP2的Activity2,点击Activity2,进入Activity1(Flag被设置成FLAG_ACTIVITY_NEW_TASK,taskAffinity与MyActivity同)。然后按返回键。我们发现,我们进入Activity的顺序为Activity2->Activity1,而返回时顺序为 Activity1->MyActivity。这是因为:启动Activity1时,其会首先检查是否存在与自己taskAffinity相同的Task,如果存在,那么它会直接宿主到该Task中,本例中就宿主到MyActivity的栈中了,如果不存在则重新创建Task。


测试示例:

1.清单文件中,对Activity B设置LaunchMode=""SingleTask"和taskAffinity后,则 B 是在新 task 中创建的,若将taskAffinity指定为APP 2 的包名且APP 2未做相关防范处理的话,则跳转到 B 后按 HOME 进入后台,这时打开APP 2,发现显示 B,按回退则退出 APP 2,再次打开APP 2则显示其入口Activity。

2.清单文件中,对Activity B设置LaunchMode=""SingleTask"和taskAffinity后,则 B 是在新 task 中创建的,再由 B 跳转到一个普通的Activity C,则 C 也在 B 的栈中;

3.FLAG_ACTIVITY_NEW_TASK标记,不一定会启动一个新的栈,其策略是:先查找有没有和这个Activity的affinity相同的task栈,如果有,则直接在这个task栈里启动,没有才创建一个新的task栈。

4.点击APP 图标时,系统将寻找root Activity所处的那个task,其中有 Activity则不会再创见入口Activity。

二.singleInstance

结论:

1.以singleInstance模式启动的Activity具有全局唯一性,即整个系统中只会存在一个这样的实例。

2.以singleInstance模式启动的Activity在整个系统中是单例的,如果在启动这样的Activiyt时,已经存在了一个实例,那么会把它所在的任务调度到前台,重用这个实例。

3.以singleInstance模式启动的Activity具有独占性,即它会独自占用一个任务,被他开启的任何activity都会运行在其他任务中。

4.被singleInstance模式的Activity开启的其他activity,能够在新的任务中启动,但不一定开启新的任务,也可能在已有的一个任务中开启。

测试示例:

1.清单文件中,对Activity B设置LaunchMode="singleInstance",B 跳转到仅设置了taskAffinity的 C,则 C 的所在栈即为其taskAffinity所指定。

1 0