@946898963
2019-01-25T16:42:00.000000Z
字数 2717
阅读 1046
Android学习笔记
标准启动模式,一个活动设置为标准模式,每次启动Activity的时候,都会在任务栈中创建该Activity的实例。
设置为标准启动模式的Activity位于启动这个Activity的Activity所在的任务栈中。如果启动Activity的组件没有任务栈,启动该Activity的时候需要设置FlAG_Activity_NEW_TASK标识,这样就会给Activity创建新的任务栈。
例如:在Service中启动Activity,利用ApplicationContext启动Activity的时候,都需要设置FlAG_Activity_NEW_TASK标识。
启动SingleTop模式的Activity,如果Activity位于栈顶,不创建新的Activity,只会调用onNewIntent方法;如果不是位于栈顶,则创建新的Activity。
应用场景:接收到消息展示的界面。
启动SingleTask模式的Activity,如果存在该Activity所需要的任务栈,同时任务栈中存在该Activity,则清空任务栈中该Activity之上的Activity,Activity的onNewIntent方法会被调用,如果不存在该Activity,就创建新的Activity;如果不存在Activity所需要的任务栈,则创建新的任务栈,同时创建新的Activity。
每个活动都存在于一个任务栈中,默认活动所需要的任务栈是当前应用程序的包名,我们也可以在AndroidManifest中通过taskAffinity指定活动所需要的任务栈。taskAffinity只有和SingleTask或者allowTaskReparenting配合使用的时候才有意义。
设置为SingleTask模式的Activity其所在的任务栈为taskAffinity所指定的任务栈。
任务栈分为前台任务栈和后台任务栈,后台任务栈中的活动都处于Pause状态。如果启动的SingleTask模式的活动已经在一个后台的任务栈中,那么该后台任务栈会一起被切换到前台,同时后台任务栈中该Activity之上的活动都会被清除。
应用场景:结束应用,将主Activity设置为SingleTask模式,在onNewItent方法中finish(),退出应用的时候,直接跳转到主Activity。
taskAffinity与allowTaskReparenting结合使用:allowTaskReparenting属性,它的主要作用是activity的迁移,即从一个task迁移到另一个task,这个迁移跟activity的taskAffinity有关。当allowTaskReparenting的值为“true”时,则表示Activity能从启动的Task移动到其affinity属性指定的Task(当这个Task进入到前台时),当allowTaskReparenting的值为“false”,表示它必须呆在启动时呆在的那个Task里。如果这个特性没有被设定,元素上的allowTaskReparenting属性的值会应用到Activity上,默认值为“false”。举个例子,现在有两个应用A和B,A启动了B的一个ActivityC,然后按Home键回到桌面,再单击B应用时,如果此时,allowTaskReparenting的值为“true”,那么这个时候并不会启动B的主Activity,而是直接显示已被应用A启动的ActivityC,我们也可以认为ActivityC从A的任务栈转移到了B的任务栈中。
补充:
在一个Activity中启动另一个应用的Activity。
Intent intent = new Intent();
ComponentName componentName = new ComponentName("tk.thinkerzhangyan.optimization","tk.thinkerzhangyan.optimization.AnimatorActivity");
intent.setComponent(componentName);
startActivity(intent);
"tk.thinkerzhangyan.optimization":被启动的Activity所在的包名。
"tk.thinkerzhangyan.optimization.AnimatorActivity": 被启动的Activity。
需要在AndroidManifest.xml中为被启动的Activity-AnimatorActivity配置
android:exported="true"
使AnimatorActivity可以从外部启动。
增强版的SingleTask,除了会具有SingleTask模式的特点外,启动该模式的Activity的时候,会为Activity创建新的任务栈。
有两种方式可以为Activity指定启动模式:
第一种,通过在AndroidManifest.xml中,为Activity设置android:launchMode=""。
<activity
android:launchMode="singleTask"
android:name="com.example.macbook.fragmentNew.MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN"/>
<category android:name="android.intent.category.LAUNCHER"/>
</intent-filter>
</activity>
第二种,通过在Intent中设置标志位。
Intent intentOne = new Intent(MainActivity.this, NewsActivity.class);
intentOne.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intentOne);
两种方式是有区别的:
- 优先级,第二种高于第一种。
- 范围,第一种可以指定的,第二种不一定可以,第二种指定的,第一种不一定可以。
参考:
《Android 第一行代码》
《Android 群英传》
《Android 开发艺术探索》