Android中activity的4种启动模式

一个任务栈中可以有来自不同应用的任务,一个应用中的任务也可以位于不同的任务栈.

应用程序的个数:默认任务栈(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。

 

 

 

你可能感兴趣的:(Android中activity的4种启动模式)