这4种启动模式都是经过在manifest中注册实现的。android
<activity android:name=".DemoActivity" android:launchMode="singleTask"/>
standard模式:全部activity都在同一个task栈中。每次启动activity,都会生成一个新的activity实例。
singleTop模式:全部activity都在同一个task栈中。启动activity时,若是该activity实例已经存在于栈顶,则复用该activity实例;不然,生成一个新的activity实例。
singleTask模式:全部activity都在同一个task栈中。启动activity时,若是该activity实例已经存在于栈中,则复用该activity实例,同时弹出该activity上面的全部实例;不然,生成一个新的activity实例。
singleInstance模式:会在一个新的task栈中启动该activity实例,且这个栈中有且只能有这一个activity实例。app
经过代码实现启动模式。code
Intent intent = new Intent(); intent.setClass(context, DemoActivity.class); intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK); context.startActivity(intent);
Intent.FLAG_ACTIVITY_NEW_TASK:在一个新的task栈中启动activity,可是并非必定会在一个新的task栈中启动activity。若是系统为该activity找到一个极具亲和力(taskAffinity的值相等)的task栈,就不会在新的task栈中启动Activity。
Intent.FLAG_ACTIVITY_CLEAR_TOP:清空当前task栈中,该activity之上的全部activity实例,当前activity是否会从新onCreate,取决因而否与Intent.FLAG_ACTIVITY_SINGLE_TOP标记连用。
Intent.FLAG_ACTIVITY_SINGLE_TOP:只用Intent.FLAG_ACTIVITY_CLEAR_TOP当前Activity会从新onCreate,Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP组合使用,当前Activity不会从新onCreate。
Intent.FLAG_ACTIVITY_CLEAR_TASK:清空当前task栈中,全部activity实例。
Intent.FLAG_ACTIVITY_CLEAR_TASK+Intent.FLAG_ACTIVITY_NEW_TASK联合使用:清空当前task栈。而后在一个新的task栈中启动activity,可是并非必定会在一个新的task栈中启动activity。若是系统为该activity找到一个极具亲和力(taskAffinity的值相等)的task栈,就不会在新的task栈中启动Activity。
Intent.FLAG_ACTIVITY_CLEAR_TOP+Intent.FLAG_ACTIVITY_NEW_TASK联合使用:清空当前task栈中,该activity之上的全部activity实例。而后在一个新的task栈中启动activity,可是并非必定会在一个新的task栈中启动activity。若是系统为该activity找到一个极具亲和力(taskAffinity的值相等)的task栈,就不会在新的task栈中启动Activity。it
假若有3个task栈,task1中包含activity1,task2中包含activity2,task3中包含activity3和activity4,假如task一、task二、task3的位置关系是,task3位于顶部。
只有最上层task栈中的activity有启动别的activity的权限:上述例子中,activity3和activity4能够启动别的activity,activity1和activity2没法启动别的activity。
顶层activity所在栈必定位于顶部:上述例子中,假如activity3启动了activity1,那么task1将被提到顶部。activity1能够启动别的activity,activity二、activity3和activity4没法启动别的activity。io
<activity android:name=".DemoActivity" android:taskAffinity="123456" android:allowTaskReparenting="true"/>
taskAffinity用于标记当前activity应该属于哪一个task栈:若是activity没有指定taskAffinity的值,那么就等于application的taskAffinity的值,若是application也没有指定,那么taskAffinity的值就等于包名。
默认状况下,Intent.FLAG_ACTIVITY_NEW_TASK不会在新的task栈中启动activity:由于能找到一个极具亲和力的task栈,默认状况下,activity的taskAffinity值都等于包名。
activity从新宿主:若是application1的activity1与application2的activity2的taskAffinity值相等,且application1的activity1的allowTaskReparenting设置为true。启动activity1后退到后台,再启动activity2时,activity1会从新宿主,也就是说会先看到activity1。class
LoginActivity->HomeActivity->ActivityA->ActivityB
假设从登录页面(登陆后页面finish),跳转到主页面,再跳转到ActivityA,再跳转到ActivityB。若是在ActivityB发现登录过时,须要从新登陆,而且登录后须要从新进入主页面(至关于所有从新启动一遍)。
方案一:能够把HomeActivity设置为singleTask。
方案二:可使用Intent.FLAG_ACTIVITY_CLEAR_TASK。
方案三:可使用Intent.FLAG_ACTIVITY_CLEAR_TOP。登录