Android中activity的4种启动模式

    xiaoxiao2025-03-13  59

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

    应用程序的个数:默认任务栈(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中的定义包含如下标签,添加如下代码就可以完成调用。 <action android:name="android.intent.action.MAIN" />

    如果没有,则需要在TestActivity中添加如下标签android:exported="true"

    注意:一个应用中的活动A启动另外一个应用中的活动B时,若B中 android:allowTaskReparenting="true",这时再启动另外一个活动,会直接跳到活动B。

     

     

     

    最新回复(0)