一个任务栈中可以有来自不同应用的任务,一个应用中的任务也可以位于不同的任务栈.
应用程序的个数:默认任务栈(1) + singleTask(taskAffinity不同的个数) + singleInstance(taskAffinity不同的个数).
应用进程的开启方式:默认任务栈(点击图标);singleTask(设定了taskAffinity且名字不同);singleInstance(设定了taskAffinity且名字不同)。
4种启动模式:
1 .standrad :
activity A 启动 activity B , B就在A所属的任务栈中入栈,主活动会在默认任务栈(包名)中入栈,但如果A 是以 singleIntance启动的,B则会在默认任务栈(包名)中入栈。入栈时不需要经过判断。
2 singleTop:
activity A 启动 activity B , B就在A所属的任务栈中入栈,主活动会在默认任务栈(包名)中入栈,但如果A 是以 singleIntance启动的,B则会在默认任务栈(包名)中入栈。入栈时要判断:如果B所入栈的栈顶活动与B相同,则B不会再建立一个,而是调用栈顶活动的onNewIntent()方法
3 singleTask:
启动活动B时,我们可以给B设置一个任务栈名(不设置则为默认任务栈(包名))。首先我们检查有没有此任务栈名,无则建立一个新任务栈,将B入栈;有则判断栈中有么有活动B,有则将上面活动全部出栈,再调用B的onNewIntent()方法
4 singleIntance:
活动B是通过singleIntance方式启动,创建一个新的任务栈放活动B(一对一),后面再次启动活动B都是都不会创建新的实例,而是调用之前B的onNewIntent()方法.
怎么样指定启动模式?
1 :android:launchMode="singleTask"
2: intent.addFlag(Intent.FLAG_ACTIVITY_NEW_TASK)
两者同时存在,2优先级高于1
怎么样访问另外一个应用的活动?
ComponentName componetName = new ComponentName(
//这个是另外一个应用程序的包名
"com.example.mytest",
//这个参数是要启动的Activity
"com.example.mytest.Main2Activity");
Intent intent= new Intent();
intent.setComponent(componetName);
startActivity(intent);
如果TestActivity在AndroidManifest.xml中的定义包含如下标签,添加如下代码就可以完成调用。
如果没有,则需要在TestActivity中添加如下标签android:exported="true"
注意:一个应用中的活动A启动另外一个应用中的活动B时,若B中 android:allowTaskReparenting="true",这时再启动另外一个活动,会直接跳到活动B。