第一行代码:Android(2nd ed)(44):先从看得到的入手——探究活动 2.5.3

阅读数:26 2019 年 10 月 23 日 05:05

第一行代码:Android(2nd ed)(44):先从看得到的入手——探究活动 2.5.3

(活动的启动模式:singleTask)

使用 singleTop 模式可以很好地解决重复创建栈顶活动的问题,但是正如你在上一节所看到的,如果该活动并没有处于栈顶的位置,还是可能会创建多个活动实例的。那么有没有什么办法可以让某个活动在整个应用程序的上下文中只存在一个实例呢?这就要借助 singleTask 模式来实现了。当活动的启动模式指定为 singleTask,每次启动该活动时系统首先会在返回栈中检查是否存在该活动的实例,如果发现已经存在则直接使用该实例,并把在这个活动之上的所有活动统统出栈,如果没有发现就会创建一个新的活动实例。

我们还是通过代码来更加直观地理解一下。修改 AndroidManifest.xml 中 FirstActivity 的启动模式:

复制代码
<activity
android:name=".FirstActivity"
android:launchMode="singleTask"
android:label="This is FirstActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>

然后在 FirstActivity 中添加onRestart()方法,并打印日志:

复制代码
@Override
protected void onRestart() {
super.onRestart();
Log.d("FirstActivity", "onRestart");
}

最后在 SecondActivity 中添加onDestroy()方法,并打印日志:

复制代码
@Override
protected void onDestroy() {
super.onDestroy();
Log.d("SecondActivity", "onDestroy");
}

现在重新运行程序,在 FirstActivity 界面点击按钮进入到 SecondActivity,然后在 SecondActivity 界面点击按钮,又会重新进入到 FirstActivity。

查看 logcat 中的打印信息,如图 2.38 所示。

第一行代码:Android(2nd ed)(44):先从看得到的入手——探究活动 2.5.3

图 2.38 singleTask 模式下的打印日志

其实从打印信息中就可以明显看出了,在 SecondActivity 中启动 FirstActivity 时,会发现返回栈中已经存在一个 FirstActivity 的实例,并且是在 SecondActivity 的下面,于是 SecondActivity 会从返回栈中出栈,而 FirstActivity 重新成为了栈顶活动,因此 FirstActivity 的onRestart()方法和 SecondActivity 的onDestroy()方法会得到执行。现在返回栈中应该只剩下一个 FirstActivity 的实例了,按一下 Back 键就可以退出程序。

singleTask 模式的原理示意图,如图 2.39 所示。

第一行代码:Android(2nd ed)(44):先从看得到的入手——探究活动 2.5.3

图 2.39 singleTask 模式示意图

评论

发布