LauchMode(Activity的启动模式)

什么是task:
这里写图片描述

A task is a collection of activities that users interact with when performing a certain job. The activities are arranged in a stack (the back stack),
用户在完成某项功能活动时,开启的所有activity的集合称作一个task,这些activity在堆栈中有序排列(按照activity开启的顺序排列),最前面的直接与用户互动的activity为堆栈的最顶端,按back返回键时,最前面的activity会关闭销毁,次高位的activity会跳到堆栈的最前面; 当开启程序的第一个activity时,也就开启了一个task(每个task都有自己的stack),当最后一个activity也destroy时,task也就结束了



当用户已经开启了程序A时,task A也就开始了, 这是用户通过home键开启程序B时,系统会创建task B(并同时创建task B的stack),task A进入后台,失去焦点,用户可以通过再次点击程序A的icon或者在recents Screen中选择程序A来将task A至于前景获得焦点



tips:当后台 task 太多系统内存不足时,会自动kill按照task开启的顺序的最先开启的tasks,导致activity的状态丢失

task中stack管理:


 - 当ActivityA开启ActivityB时,ActivityA停止并调用onStop()方法,系统会自动保存activityA的状态(滚动条滚动的位置,UI的状态等),当按下backButton,activityA回到前景恢复并调用onResume()方法UI状态也恢复到之前系统保存的样子,

 - 当用户按homeButton时,当前activity会停止调用onStop()方法,当前task会进入到后台,当通过点击程序图标,最次将task调到前景时,堆栈最顶端的activity恢复调用onStart()-onResume()方法,并恢复系统记录的UI状态

 - 当用户通过backButton 关闭销毁当前的activity时,当前activity 调用onPause()-onStop()-onDestroy()方法,系统将不再保存当前activity的UI状态,stack中次高的activity进入到前景恢复调用onRestart()-onResume()方法,并恢复系统记录的UI状态

设置Activity的启动模式方法:

  • 方法一:在manifest中设置(该方法可以被第二种方法覆盖)
 <!--通过activity的android:lauchMode属性来设置-->
 <activity android:name=".MainActivity" android:label="@string/app_name"
           android:launchMode="singleInstance" >



(1).standard: 标准模式(默认模式)每次启动该activity都会创建一个新的实例;
这里写图片描述

(2).singleTop:栈顶单例模式,如果该activity有一个实例在栈顶,则再次启动时不会创建一个新实例,而是调用
该栈顶 实例的onNewIntent()方法,如栈顶不是该activity的实例,则会重新创建一个该activity的新实例;

(3).singleTask;首次开启该activity时,系统会自动开启一个新task,并在新task中实例化该
acitivity,如后台task中已存在该activity实例,则以后每次调用都将后台的task调到前台并调用该activity
的onNewIntent()方法来代替创建实例,该后台task具有自己的backStack,那么整个backStack也会出现在当前任务stack的顶部。
这里写图片描述

(4).singleInstance,与singleTask一样,不同点是:系统不会将其他的activity的实例放置在有该activity的task中。该activity始终是其task的单一且唯一成员,由该activity启动的其他的activity都另一个单独的task中开启。

  • 方法二:通过设置开启activity的intent的Flag
Intent intent = new Intent(Intent.ACTION_PICK);
intent.setType("image/*");
intent.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);//为intent添加启动模式(可覆盖在manifest中的模式设置)

                Intent.FLAG_ACTIVITY_NEW_TASK; //在一个新task中开启这个activity实例,如后台已经存在已经包含这个activity的一个实例的task,这不创建新的task,将后台的那个task调动至前景,该activity实例移动至该task的stack的顶端回调onNewIntent()方法,并恢复系统自动保存的该activity的UI状态——>与singleTask的作用一致

                Intent.FLAG_ACTIVITY_SINGLE_TOP; //与singleTop的作用一样,该task中若stack顶端已经存在该activity实例则直接调该activity的onNewIntent()方法而不会创建新实例,若顶端不是该activity实例,则会创建一个新的实例

                Intent.FLAG_ACTIVITY_CLEAR_TOP; //当该task中存在该activity的实例时,再次开启会将stack中排在该activity实例上面的其他activity实例全部销毁,此时该activity实例排在stack顶端回调onRestart()-onResume()-onNewIntent()方法,恢复该activity的系统保存的状态,可与其他Flag或者manifest中的lauchmode结合作用

                Intent.FLAG_ACTIVITY_NEW_DOCUMENT; //代替过时的FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET当当前的task从后台返回前景时,该intent开启的activity将不存在于stack记录中(该设置主要用于应用程序开启其他程序的activity后返回stack中的activity时可以跳过其他程序的activity) 

startActivity(intent);

affinity 亲密关系(表示该activity是属于哪一个task,具有相同taskAffinity属性值的activity处于同一个task中)
默认的来自同一应用程序的所有活动都具有同一种亲密关系(既来自同一个应用程序的所有activity都处于同一个task中)可以在manifest中修改亲密关系,使得来自不同程序的activity同处于一个task中,同一个程序的activity处于不同的task中

<activity android:name=".MainActivity"

          android:taskAffinity="">
       <!--taskAffinity的值必须是唯一的字符串,默认值为在manifest中声明的包名,系统通过默认的affinity识别来自同一个application的activity具有相同的亲密关系(既处于同一个task中)-->

taskAffinity的作用环境(没有以下作用环境,taskAffinity将不具有作用):

当startActivity(intent),设置intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);时,

**开启该activity时,设置该Flag时系统会搜寻是否存在和这个activity的taskAffinity相同的后台task存在,若存在则该activity的新的实例将会被放置到这个task中,若没有相同taskAffinity的后台task存在,系统会创建一个新的task来放置该activity的新实例**
当activity在manifest中设置属性allowTaskReparenting为true时;

 <activity android:name=".MainActivity"
           android:allowTaskReparenting="true">//activity实例可以从它开始的task,转移到和它taskAffinity属性相同的任务中去,(当用户用程序A中的activityA 启动程序B中的activityB时,若activityB的allowTaskReparenting设置为true,则,用activityA 启动activityB时,activityB的实例将放置在taskA中)

清除堆栈管理(Clearing the back stack)
当task处于后台长时间无操作时,系统会默认自动清楚除了根activity之外的所有的activities,当用户再次将这个task置于前景时,只有root activity的状态被保存,可以通过属性来改变堆栈的清除

  • 当在task的root activity的manifest中设置属性alwaysRetainTaskState为true时,系统向不会自动清楚该task中的所有activities
 <activity android:name=".MainActivity"
            android:alwaysRetainTaskState="true">
  • 当在task的root activity的manifest中设置属性clearTaskOnLaunch为true时,一旦task进入后台系统就会立刻清除除了root activity之外的所有activities(与alwaysRetainTaskState相反)
<activity android:name=".MainActivity"
                  android:clearTaskOnLaunch="true">
  • 当在task中的任何activity(包括root activity)的manifest中设置属性finishOnTaskLaunch为true时,一旦task进入后台系统就会立刻清除该activity,(属于单个activity作用,而不是作用于整个task)
 <activity android:name=".MainActivity"
           android:finishOnTaskLaunch="true">

开启task的入口
intent-filter 为开启root activity的入口,同时也是返回task的方法,若task中没有intent-filter,task进入后台后将没办法在转入前景,

<activity ... >
    <intent-filter ... >
        <action android:name="android.intent.action.MAIN" />
        <category android:name="android.intent.category.LAUNCHER" />
    </intent-filter>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值