您的位置:首页 > 移动开发 > Android开发

Android中activity任务亲和力问题

2016-07-27 18:11 309 查看

首先是activity开启方式:Standard:默认,窗口类可以实例化多次singleTop: 在一些特殊情况下,为了避免糟糕的用户体验,如果发现任务栈的栈顶已经存在这个activity,再去开启activity的时候,就不去重新创建新的activity,而是复用这个栈顶已经存在的activity.这种模式叫singleTop的启动模式,避免同一个界面被重复的开启singleTask: 开启一个activity B的时候,检查任务栈里面是否有这个activity B存在,如果存在的话,清空这个任务栈上面的所有的activity,复用这个activity B,作用,避免创建过多的浏览器activity的实例,节约内存空间,节约CPU资源,不要创建过多的应用程序的界面singleInstance: 会去开启一个新的任务栈,任务栈里面只有一个activity的实例存在,如果这个activity被开启,把这个任务栈放在前面,如果开启了新的activity,别的activity所在的任务栈会被放在前面,这种模式非常的极端,在整个手机的操作系统里,只会有一个

理解和处理任务亲和力

  亲和力表明了一个activity"心仪"哪个任务.默认下,属于同一个应用的所有activitie之间具有相同的任务亲和力.所以,默认下,一个应用的所有activitie首选属于同一任务.然而,你可以修改一个activity的默认任务亲和力.定义于不同应用的Activitie可以具有相同的任务亲和力,或者同一应用中的activitie可以分配不同的任务亲和力.在API文档中与该亲和力相关的属性有两个: [code]android:allowTaskReparenting,
android:taskAffinity。
android:allowTaskReparenting ---->
用法:<application android:allowTaskReparenting="true/false"></application>
是否允许activity更换从属的任务,比如从短信息任务 切换到浏览器任务。

用来标记Activity能否从启动的Task移动到有着affinity的Task(当这个Task进入到前台时)——“true”,表示能移动,“false”,表示它必须呆在启动时呆在的那个Task里。
属性概念:
我称之为是否具有亲和力。如果这个属性设置在<application>中,默认值是false,通常当一个活动开始时,它与启动它的活动的任务关联,它的整个生命周期都停留在这个任务栈中。您可以使用此属性来将它强制重定位到具有亲和性的其他任务中,而当前的主要任务不再显示。通常情况下,它用于导致应用程序的活动移动到与该应用程序相关联的主要任务。当当前的Task不再显示时,你可以使用这个特性来强制Activity移动到有着affinity的Task中。典型用法是:把一个应用程序的Activity移到另一个应用程序的主Task中。
如果一个电子邮件包含一个链接到一个网页,点击链接带来了一个活动,可以显示页面。该活动是由浏览器应用程序定义的,但作为电子邮件任务的一部分启动。如果它被重定位到浏览器的任务,它将显示在浏览器下来到面前,并将在电子邮件任务又缺席了。
Actvity的affinity是由taskAffinity特性定义的,称之为亲和对象。Task的affinity是通过读取根Activity的affinity 决定。在,判断具有亲和力之后,寻找通过该属性定义的任务栈,如何有则会加载进去,没有则会根据Flag来判断是否创建任务栈。第一种情况。如果该Activity的allowTaskReparenting设置为true,它进入后台,当一个和它有相同affinity的Task进入前台时,它会取消之前的亲和力,进入到该前台的task中。 例如:在两个工程中,activity1和activity2,activity1,activity2中的<activity>中都添加android:taskAffinity="com.example.activity2"(包名)而activity1中的<activity>在添加android:allowTaskReparenting="true"使其允许添加亲和性。在运行时当打开activity1后home键(不要按返回)放置后台栈中,再打开activity2时会发现打开了activity1界面。这就是在加载activity2时,activity1也加载到新创建的activity2栈中并显示出来。第二种情况。如果加载某个Activity的intent,Flag被设置成FLAG_ACTIVITY_NEW_TASK时,它会首先检查是否存在与自己taskAffinity相同的Task,如果存在,那么它会直接宿主到该Task中,如果不存在则重新创建Task。例如:在activity1中不设置亲和力(allowTaskReparenting),但要设置他的任务栈,也就是亲和对象是自己。而在activity2中设置一个intent来打开一个新的activityS,注意在设置的intent的Flag属性为FLAG_ACTIVITY_NEW_TASK,并在清单文件中设置activityS的亲和力为true,亲和对象为activity1。完成后就可以逐一运行了。当打开activity1后home键返回后打开activity2并点击按钮打开activityS,发现没有任何意外。但是在返回的时候发现activityS跳到了activity1最后跳到了activity2。  亲和力在以下两种情况起作用:当启动一个activity的intent包含FLAG_ACTIVITY_NEW_TASK标志.  一个新的activity默认是在调用startActivity()的activity所在的任务中安置.然而,如果传给startActivity()的intent包含了FLAG_ACTIVITY_NEW_TASK标志,系统就会查找另一个能安置这个新activity的任务.通常,它会是一个新任务.然而但是,并不是必须这样做.如果有一个已存在的任务具有与新activity相同的亲和力,那么这个activity就被启动并安置到这个已存在的任务中.如果没有这样的任务,才开始一个新的任务.  如果这个标志导致了一个activity在一个新的任务中启动然后用户按下了HOME键离开了这个新任务,那么必须有一些方法使得用户可以重新回到这个任务.一些实体(比如通知管理器)总是在一个另外的任务中启动activity而从不作为自己任务的一部分,于是它总是把FLAG_ACTIVITY_NEW_TASK设置到传给startActivity()的intents中.如果你有一个activity可以被外部实体使用这个标志调用,应小心用户可能用一个独立的方法回到这个启动的任务,比如使用启动图标(任务的根activity有一个CATEGORY_LAUNCHERintent 过滤器).-翻译得挺难受,这句话也就是说,只要使用了相同的亲和力,用户就能回到这个已启动的任务中.当一个activity的allowTaskReparenting属性为"true"时.  在此情况下,activity可以从启动它的任务移动到一个亲和的任务中,当后一个任务来到前台时.  例如,假设一个报告所选城市的天气状况的activity是作为一个旅游应用的一部分.它与同一个应用中的其它activity具有相同的亲和力(默认的application亲合力)并且它被允许重认父母.当你的一个activity启动了这个天气预报activity,它起初是与你的actvity属于同一个任务.然而,当旅游应用的任务进入前台时,天气预报activity就被重新分配到这个任务并在其只显示.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: