android开发艺术探索 学习笔记(二) Activity的启动模式

来源:互联网 发布:洗数据 编辑:程序博客网 时间:2024/05/31 06:24

一.为什么要有Activity的启动模式?

    我自己在学习本书之前,做个过一个小程序,其中有一个功能是,点击通知栏的消息返回Activity    但是我遇到了麻烦,每次点击通知栏都会打开一个新的Acitivity,退出程序时要按好多下back键    于是百度搜索解决方法,才第一次接触到启动模式,这次就借本书,系统的学下。

二.4种启动模式

1.standard    standard启动模式会创建一个新的Activity放入启动它的Context的任务栈中。    如果启动它的Context不存在任务栈,系统就会以给他创建一个新的任务栈,并以singleTask模式启动在这个新的任务栈中。2.singleTop    singleTop会先去查看当前任务栈顶是否已经是我们要启动的Activity。    如果是那么将不会创建新的Activity(也就不会去调用,onCretea,onStart,onResume),将会回调onNewIntent来用于接收新的数据。3.singleTask    singleTask会先去查看当前任务栈(注意:没有顶字)是否已经有我们要启动的Acitivity。    还有一点要注意的是,当Acitivity通过singleTask模式启动后到了任务栈的顶部,位于它前面的Acitivity都将会被弹出任务栈。4.singleInstance    singleInstance具有singleTask的加强版,具有它的所有特性。    加强之处在于,singleInstance会给Activity建立一个独立的,特殊的任务栈,这个任务栈只能用于存放该Activity。    由于singleInstance和singleTask效果相同,所以该任务栈有且只有一个Activity。    放开来说,永远只有一个相同的该Activity。

如果后台任务栈中的Activity被请求那么后台任务栈会被压入到前台任务栈中。
压入过程有个特殊情况,如果被请求的Activity不再后台任务栈的顶部,会先把后台任务栈弹出到到当前要请求的Activity再送到前台

三.什么是Activity所需任务栈

1.在android程序中,Activity是由栈的形式来进行管理的,栈大家都知道是“后进先出”原则,所以如果我们启动activity的顺序是ABC,那么我们按back键显示的顺序就会是CBA。我们称为任务栈(Task)

四.Activity中有关Task的属性

1.taskAffinity这个属性表示我们启动Activity所在的任务栈,如果没有就会去创建这个任务栈。    taskAffinity的属性值不能为包名,不然没有意义,因为默认值为包名。taskAffinity常与singleTask启动模式或者allowTaskReparenting属性配合。2.allowTaskReparenting这个属性有点难理解,意思为Activity能否转移到他应该在的任务栈。举个例子:当我们有两个程序:APK1,APK2。APK1中有MainActivity与ActivityB。APK2中有MainActivity,APK2是一个可以处理ActivityB的程序。当APK1中的MainActivity.启动了带有allowTaskReparenting属性为真的ActivityB。这时我们按下Home键,然后打开APK2,显示的并不是APK2的MainActivity,而是ActivityB。一下为证实代码与截图

APK1中Activity属性设置

<?xml version="1.0" encoding="utf-8"?><manifest xmlns:android="http://schemas.android.com/apk/res/android"package="com.example.tasktextfirst"><application    android:allowBackup="true"    android:icon="@mipmap/ic_launcher"    android:label="@string/app_name"    android:roundIcon="@mipmap/ic_launcher_round"    android:supportsRtl="true"    android:theme="@style/AppTheme">    <activity android:name=".MainActivity">        <intent-filter>            <action android:name="android.intent.action.MAIN" />            <category android:name="android.intent.category.LAUNCHER" />        </intent-filter>    </activity>    <activity android:name=".ActivityB"        android:taskAffinity="com.example.tasktestsecond"        android:allowTaskReparenting="true"></activity></application></manifest>

可以看到,ActivityB的taskAffinity改成APK2的包名,allowTaskReparenting设置为真
APK1中只要有个按钮用于启动ActivityB就好,APK2不用改写,只要包名对上就好。
以下为运行截图
先运行APK1
先运行APK1

点击按钮启动ActivityB
点击按钮启动ActivityB
按下Home键返回桌面,再启动APK2
按下Home键返回桌面,再启动APK2
还是ActivityB。

五.如何给Activity设置启动方式

1.AndroidManifest中为Activity添加属性。
android:launchMode="singleTask"
2.Intent启动时使用addFlag
Intent intent = new Intent(MainActivity.this,ActivityB.class);                intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);                startActivity(intent);
注意:两种方法均有办不到的时候.第一种无法设置FLAG_ACTIVITY_CLEAR_TOP标志第二种无法设置singleInstance启动方式.优先级:第二种>第一种,会覆盖.

六.FLAG介绍

1.FLAG_ACTIVITY_NEW_TASK等同于singleTask启动模式2.FLAG_ACTIVITY_SINGLE_TOP等同于singleTop启动模式3.FLAG_ACTIVITY_CLEAR_TOP配合FLAG_ACTIVITY_NEW_TASK使用会清楚要启动的Activity上的其他Activity出栈.然后调用onNewIntent配合standard,会连它自己与它之上的Activity都出栈,然后重新创建。4.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS禁止从历史列表回到该Acitivity.等同于属性`android:excludeFromRecents="true"`
阅读全文
0 0
原创粉丝点击