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

阅读数:32 2019 年 10 月 23 日 05:04

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

(活动的启动模式:singleTop)

可能在有些情况下,你会觉得 standard 模式不太合理。活动明明已经在栈顶了,为什么再次启动的时候还要创建一个新的活动实例呢?别着急,这只是系统默认的一种启动模式而已,你完全可以根据自己的需要进行修改,比如说使用 singleTop 模式。当活动的启动模式指定为 singleTop,在启动活动时如果发现返回栈的栈顶已经是该活动,则认为可以直接使用它,不会再创建新的活动实例。

我们还是通过实践来体会一下,修改 AndroidManifest.xml 中 FirstActivity 的启动模式,如下所示:

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

然后重新运行程序,查看 logcat 会看到已经创建了一个 FirstActivity 的实例,如图 2.35 所示。

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

图 2.35 singleTop 模式下的打印日志

但是之后不管你点击多少次按钮都不会再有新的打印信息出现,因为目前 FirstActivity 已经处于返回栈的栈顶,每当想要再启动一个 FirstActivity 时都会直接使用栈顶的活动,因此 FirstActivity 也只会有一个实例,仅按一次 Back 键就可以退出程序。

不过当 FirstActivity 并未处于栈顶位置时,这时再启动 FirstActivity,还是会创建新的实例的。

下面我们来实验一下,修改 FirstActivity 中onCreate()方法的代码,如下所示:

复制代码
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Log.d("FirstActivity", this.toString());
setContentView(R.layout.first_layout);
Button button1 = (Button) findViewById(R.id.button_1);
button1.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(FirstActivity.this, SecondActivity.class);
startActivity(intent);
}
});
}

这次我们点击按钮后启动的是 SecondActivity。然后修改 SecondActivity 中onCreate()方法的代码,如下所示:

复制代码
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Log.d("SecondActivity", this.toString());
setContentView(R.layout.second_layout);
Button button2 = (Button) findViewById(R.id.button_2);
button2.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(SecondActivity.this, FirstActivity.class);
startActivity(intent);
}
});
}

我们在 SecondActivity 中的按钮点击事件里又加入了启动 FirstActivity 的代码。现在重新运行程序,在 FirstActivity 界面点击按钮进入到 SecondActivity,然后在 SecondActivity 界面点击按钮,又会重新进入到 FirstActivity。

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

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

图 2.36 singleTop 模式下的打印日志

可以看到系统创建了两个不同的 FirstActivity 实例,这是由于在 SecondActivity 中再次启动 FirstActivity 时,栈顶活动已经变成了 SecondActivity,因此会创建一个新的 FirstActivity 实例。现在按下 Back 键会返回到 SecondActivity,再次按下 Back 键又会回到 FirstActivity,再按一次 Back 键才会退出程序。

singleTop 模式的原理示意图,如图 2.37 所示。

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

图 2.37 singleTop 模式示意图

评论

发布