activity的一些属性值详解

来源:互联网 发布:java分解质因数 编辑:程序博客网 时间:2024/06/07 09:11

taskAffinity

        它指明当前的activity所希望属于的栈。如果没有指定,就按<application>中的taskAffinity的值,如果后者也没有指定,就指的是在清单文件中声明的包名。一个栈有一个affinity,它的值指的是这个栈的根activity的taskAffinity的值。因此,当所有的activity都不指定taskAffinity的时候,这些activity都会进入同一个栈中(因为taskAffinity的值都是清单文件中声明的包名)。

allowTaskReparenting

        是否允许当前的activity重新宿主到具有相同的affinity的栈中,当该栈处于前台时。假设应用A有一个activityA的taskAffinity的值为com.example.demo1,且allowTaskReparenting为true;应用B有一个activityB的taskAffinity也为com.example.demo1。那么先运行应用A,运行后按小房子。再运行应用B,这时会发现显示的是activityA的内容。这是因为,activityA允许该activity重新宿主。因此,当activityB启动的时候,会建立一个affinity为com.example.demo1的栈,这个栈的affinity和activityA的taskAffinity一样,所以activityA就重新宿主(也就是移动到了activityB启动的栈中)了。再比如,应用A中启动了应用B的activityA(该activity的此属性值为true),那么当运行应用B时,显示的会是activityA(从应用A的task中重宿到应用B的task中)。

excludeFromRecents

        是否从最近浏览中删除。如果为true,则在最近浏览中无该应用图标,否则有。默认值为false。

exports

       是否允许别的应用程序打开该activity,true是允许。false是不允许。它的默认值是根据<intent-filter>来的,如果含有<intent-filter>,则默认值为true。否则默认值为false。

stateNotNeeded

        在正常情况下,在一个activity调用finish()之前会调用onSavaInstanceState()用来保存该activity的状态,并会将它的状态存储到一个Bundle的对象中。当该activity再次启动时,就会把该Bundle对象传到onCreate()方法中。如果该属性设置为true了,那么就不会调用onSavaInstanceState()方法,那么onCreate()方法中传入的参数就是null,就像该activity第一次被创建时一样。默认值是false。

alwayRetainTaskState

       当某个栈处于后台的时间过长,系统会自动回收这个栈中的除了根activity外的所有activity。如果在根activity设置了该属性并且值为true,那么这个栈中的所有activity都不会被系统回收,无论离开多长时间。

clearTaskOnLaunch

         根activity该值为true,那么该栈中除了根activtiy外的所有activity,在该栈一进入后台的时候都会被清空。如果allowTaskReparenting与clearTaskOnLaunch都设置为true,那么在启动某一个栈的时候,该栈中能重新宿主的activity都会重新宿主,不能重新宿主的activity都会被清掉。该属性只对根activity设置有效,task中其它activity设置无效。

finishOnTaskLaunch

        它和clearTaskOnLaunch类似,但是只能作用于一单个的activity,而不能作用于一个栈。当某一个activity的该属性值设置为true时,该activity所处的栈再次处于前台时,这个activity会finish掉,即使它设置了allowReparenting=true。

启动模式

        定义activity的启动模式有两种方式:清单文件和通过intent.setFlag()。如果两者同时存在,以后者为准

standard

        标准启动模式。谁启动了该activity,那么该activity就会运行在启动它的activity所在的栈中。因此,在非activity中启动activity时,必须为intent设置FLAG_ACTIVITY_NEW_TASK标识,因为非activity没有任务栈。

singleTask

        参考

        1. 设置了"singleTask"启动模式的Activity,它在启动的时候,会先在系统中查找属性值affinity等于它的属性值taskAffinity的task是否存在如果存在,它就会在这个任务中启动,否则就会在新任务栈中启动。因此,如果我们想要设置了"singleTask"启动模式的Activity在新的任务中启动,就要为它设置一个独立的taskAffinity属性值。这也可以解释为什么在同一个应用中启动singleTask的activity会是在同一个task,而不同应用中启动时却不是同一个task。因为默认时目标activity的taskAffinity为应用的包名,不同应用时taskAffinity与启动activity所在的task的affinity值不一致,因此目标activity会在新的task中启动。

        2. 如果设置了"singleTask"启动模式的Activity不是在新的任务中启动时,它会在已有的任务中查看是否已经存在相应的Activity实例,如果存在,就会把位于这个Activity实例上面的Activity全部结束掉,即最终这个Activity实例会位于任务的堆栈顶端中。如果不存在,就新建一个目标activity的实例,并压入相应的task的顶端。

        3,如果目标activity不是在新task中启动,那么目标activity所在的task会被挪移到前台,从而该task中的activity位于启动activity前面。如下:


        文字说明为:A representation of how an activity with launch mode "singleTask" is added to the back stack. If the activity is already a part of a background task with its own back stack, then the entire back stack also comes
forward, on top of the current task.

singleInstance

        新建一个栈,并将该activity放到该栈中,而且这个栈中不会放入别的任意的activity。

       当启动模式为上述两种时,startActivityForResult()是无效的。onActivityResult()会立即执行,并且resultCode为RESULT_CANCELED。

0 0
原创粉丝点击