Activity的启动模式(LaunchMode)分析



一:设置Activity的启动模式:
   android:launchMode=""
<activity
android:name=".activity.StandardModeActivity"
android:label="@string/title_activity_standard_mode"
android:launchMode="standard" > //不写,默认是standard模式
</activity>

相关知识点:任务栈(也叫返回栈(back栈)) 
1,设置Activity的android:taskAffinity,不写的话默认是包名,也可以任意写;值是字符串,且必须包含包名分隔符"."
<activity
android:name=".activity.TaskModeActivity"
android:label="@string/title_activity_task_mode"
android:launchMode="singleTask"
android:taskAffinity="com.wzh.launchmodetest"> //不写,默认是包名
</activity>
也可以修改为:android:taskAffinity="com.heihei"。
2,Activity实例要放入到任务栈中管理
     每按back键一次就会有一个Activity出栈,如果栈空了,那么系统会回收这个栈

3,谁启动了这个Activity,那么这个Activity就运行在启动它的那个Avtivity所在的栈中;
      如:Activity A中启动了Activity B(standard模式),那么B就会进入到A所在的栈中

Activity的启动模式:
standard:标准模式;  默认的启动模式
      每次启动一个Activity都会重新创建该Activity的实例,无论该Activity是否已经存在;
      每次启动都会走一次生命周期,onCreate(),onStart(),onResume()。

singleTop:(Task栈) 顶单例模式
       如果新的Activity已存在且位于任务栈的栈顶,那么该Activity不会重新创建,只回调它的onNewIntent()方法;如果新Activity存在且不位于栈顶,那么新Activity会创建实例;
    TopModeActivity位于任务栈栈顶,然后在重新启动自己
1716-1716/com.wzh.activitylaunchmodetest D/TopModeActivity﹕ ---- onPause()----
1716-1716/com.wzh.activitylaunchmodetest D/TopModeActivity﹕ ---- onNewIntent()----
1716-1716/com.wzh.activitylaunchmodetest D/TopModeActivity﹕ ---- onResume()----

singleTask:(Task栈)内单例模式
    假如Activity A,其android:launchMode="singleTask" ,android:taskAffinity="com.wzh.test";启动A的话,那么要看存不存在其所需要的返回栈com.wzh.test,如果不存在,那么创建该任务栈,然后创建A的实例,将其压入栈中;如果存在,那么还要看该任务栈有没有A的实例,如果,那么就不再创建A的实例,而是调用其onNewIntent()方法,并且将A之上的所有Activity移除栈内让A位于栈顶;如果没有,那么创建A的实例,压入栈顶
    singleTask模式下的Activity,再任务栈中有实例,再次启动
7218-7218/com.wzh.activitylaunchmodetest D/TaskModeActivity﹕ ----onPause()----
7218-7218/com.wzh.activitylaunchmodetest D/TaskModeActivity﹕ ----onNewIntent()----
7218-7218/com.wzh.activitylaunchmodetest D/TaskModeActivity﹕ ----onResume()----

singleInstance:全局单例模式
        这个跟singleTask基本上是一样,只有一个区别:在这个模式下的Activity实例只能单独的位于一个任务栈中,这个任务栈不能再有其它的实例,其实就是该Activity独自位于新的任务栈中;后续再来启动该Activity的话均不会再重新创建该Activity的实例,除非这个独特的任务栈被系统销毁

前台任务栈和后台任务栈:



经验:1,由此可以看出每个Activity都可以随意指定一个新的任务栈,设置android:taskAffinity
     2,一个应用程序可以有多个任务栈
     3,任务栈可分为前台任务栈和后台任务栈,后台任务栈中的Activity处于暂停状态,用户可以通过切换将后台任务栈再次调到前台(通过startActivity()启动后台任务栈中的Activity,就可以将后台任务栈变为前台)



Activity的Flags(标志位)
  有些标志位可以设定Activity的启动模式
Intent it = new Intent() ;
it.setClass(MainActivity.this,SecondActivity.class) ;
it.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP) ;
startActivity(it);

一般的标志位有:
FLAG_ACTIVITY_SINGLE_TOP
    作用跟设置Activity的android:launchMode="singleTop"效果一样,这个是动态的
FLAG_ACTIVITY_NEW_TASK;
作用跟设置Activity的android:launchMode="singleTask"效果一样,这个是动态的
FLAG_ACTIVITY_CLEAR_TOP;
    表示当具有此标志的Activity启动时,在同一任务栈中的所有位于它之上的Activity都要出栈,一般要跟singleTask模式一块出现







 
一:设置Activity的启动模式:
   android:launchMode=""
<activity
android:name=".activity.StandardModeActivity"
android:label="@string/title_activity_standard_mode"
android:launchMode="standard" > //不写,默认是standard模式
</activity>

相关知识点:任务栈(也叫返回栈(back栈)) 
1,设置Activity的android:taskAffinity,不写的话默认是包名,也可以任意写;值是字符串,且必须包含包名分隔符"."
<activity
android:name=".activity.TaskModeActivity"
android:label="@string/title_activity_task_mode"
android:launchMode="singleTask"
android:taskAffinity="com.wzh.launchmodetest"> //不写,默认是包名
</activity>
也可以修改为:android:taskAffinity="com.heihei"。
2,Activity实例要放入到任务栈中管理
     每按back键一次就会有一个Activity出栈,如果栈空了,那么系统会回收这个栈

3,谁启动了这个Activity,那么这个Activity就运行在启动它的那个Avtivity所在的栈中;
      如:Activity A中启动了Activity B(standard模式),那么B就会进入到A所在的栈中

Activity的启动模式:
standard:标准模式;  默认的启动模式
      每次启动一个Activity都会重新创建该Activity的实例,无论该Activity是否已经存在;
      每次启动都会走一次生命周期,onCreate(),onStart(),onResume()。

singleTop:(Task栈) 顶单例模式
       如果新的Activity已存在且位于任务栈的栈顶,那么该Activity不会重新创建,只回调它的onNewIntent()方法;如果新Activity存在且不位于栈顶,那么新Activity会创建实例;
    TopModeActivity位于任务栈栈顶,然后在重新启动自己
1716-1716/com.wzh.activitylaunchmodetest D/TopModeActivity﹕ ---- onPause()----
1716-1716/com.wzh.activitylaunchmodetest D/TopModeActivity﹕ ---- onNewIntent()----
1716-1716/com.wzh.activitylaunchmodetest D/TopModeActivity﹕ ---- onResume()----

singleTask:(Task栈)内单例模式
    假如Activity A,其android:launchMode="singleTask" ,android:taskAffinity="com.wzh.test";启动A的话,那么要看存不存在其所需要的返回栈com.wzh.test,如果不存在,那么创建该任务栈,然后创建A的实例,将其压入栈中;如果存在,那么还要看该任务栈有没有A的实例,如果,那么就不再创建A的实例,而是调用其onNewIntent()方法,并且将A之上的所有Activity移除栈内让A位于栈顶;如果没有,那么创建A的实例,压入栈顶
    singleTask模式下的Activity,再任务栈中有实例,再次启动
7218-7218/com.wzh.activitylaunchmodetest D/TaskModeActivity﹕ ----onPause()----
7218-7218/com.wzh.activitylaunchmodetest D/TaskModeActivity﹕ ----onNewIntent()----
7218-7218/com.wzh.activitylaunchmodetest D/TaskModeActivity﹕ ----onResume()----

singleInstance:全局单例模式
        这个跟singleTask基本上是一样,只有一个区别:在这个模式下的Activity实例只能单独的位于一个任务栈中,这个任务栈不能再有其它的实例,其实就是该Activity独自位于新的任务栈中;后续再来启动该Activity的话均不会再重新创建该Activity的实例,除非这个独特的任务栈被系统销毁

前台任务栈和后台任务栈:


经验:1,由此可以看出每个Activity都可以随意指定一个新的任务栈,设置android:taskAffinity
     2,一个应用程序可以有多个任务栈
     3,任务栈可分为前台任务栈和后台任务栈,后台任务栈中的Activity处于暂停状态,用户可以通过切换将后台任务栈再次调到前台(通过startActivity()启动后台任务栈中的Activity,就可以将后台任务栈变为前台)



Activity的Flags(标志位)
  有些标志位可以设定Activity的启动模式
Intent it = new Intent() ;
it.setClass(MainActivity.this,SecondActivity.class) ;
it.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP) ;
startActivity(it);

一般的标志位有:
FLAG_ACTIVITY_SINGLE_TOP
    作用跟设置Activity的android:launchMode="singleTop"效果一样,这个是动态的
FLAG_ACTIVITY_NEW_TASK;
作用跟设置Activity的android:launchMode="singleTask"效果一样,这个是动态的
FLAG_ACTIVITY_CLEAR_TOP;
    表示当具有此标志的Activity启动时,在同一任务栈中的所有位于它之上的Activity都要出栈,一般要跟singleTask模式一块出现







 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值