1,活动的启动模式
在 Android 中,Activity 的启动模式主要有以下四种:
默认启动模式(Normal):这是默认的启动模式,基本上就是标准的启动模式。当一个 Activity 启动后,它将会被压入堆栈。如果用户再次启动这个 Activity,那么之前的实例会被暂停并压入堆栈顶,然后新的实例开始运行。
栈顶启动模式(SingleTop):在这种模式下,如果新的 Activity 在堆栈顶已经存在,则不会创建新的 Activity,而是通过调用已经存在的实例的 onNewIntent() 方法来通知它。
栈内启动模式(SingleTask):在这种模式下,如果新的 Activity 不在堆栈顶,系统会创建新的 Activity 并压入堆栈;如果新的 Activity 已经在堆栈中存在,那么系统不会创建新的实例,而是通过调用已经存在的实例的 onNewIntent() 方法来通知它。
单例启动模式(SingleInstance):这是一种特殊的栈内启动模式。在这种模式下,Activity 只能在一个任务的实例中存在,它始终位于堆栈的顶部。即使系统任务切换,它也不会被替换。当一个 SingleInstance Activity 被启动时,系统会创建一个新的任务栈并把 Activity 压入栈顶。
以上就是 Android 中 Activity 的四种启动模式。需要注意的是,这些启动模式并不能防止 Activity 被系统杀死,它们只是在需要创建新的 Activity 或者在已经存在的 Activity 上启动新的 Intent 时,决定了系统如何处理这些 Activity。
可以在AndroidManifest.xml中通过标签指定android:luanchMode属性来选择启动模式。
2,不同模式的启动原理
以下是一个 Android 中不同启动模式运行的例子。
假设有两个 Activity,分别是 FirstActivity 和 SecondActivity。
默认启动模式(Normal):
如果 FirstActivity 启动了 SecondActivity,那么 FirstActivity 会被暂停并压入堆栈,SecondActivity 会开始运行。如果再次启动 SecondActivity,会创建一个新的 SecondActivity 实例并压入堆栈,之前的 SecondActivity 实例会被暂停。
栈顶启动模式(SingleTop):
如果 SecondActivity 已经在堆栈顶,那么当再次启动 SecondActivity 时,系统不会创建新的 SecondActivity 实例,而是通过调用已经存在的实例的 onNewIntent() 方法来通知它。如果 SecondActivity 不在堆栈顶,系统会创建一个新的 SecondActivity 实例并压入堆栈顶。
栈内启动模式(SingleTask):
如果 SecondActivity 不在堆栈中,系统会创建一个新的 SecondActivity 实例并压入堆栈。如果 SecondActivity 已经在堆栈中存在,那么系统不会创建新的实例,而是通过调用已经存在的实例的 onNewIntent() 方法来通知它。在这个模式下,即使系统任务切换,SecondActivity 也不会被替换。
单例启动模式(SingleInstance):
在这个模式下,SecondActivity 只能在一个任务的实例中存在,它始终位于堆栈的顶部。当 FirstActivity 启动 SecondActivity 时,系统会创建一个新的任务栈并把 SecondActivity 压入栈顶。即使系统任务切换,SecondActivity 也不会被替换。当再次启动 SecondActivity 时,系统不会创建新的实例,而是通过调用已经存在的实例的 onNewIntent() 方法来通知它。
3,activity启动模式运行代码参考例子
以下是一个简单的 Android 代码示例,演示了不同启动模式下的 Activity 运行情况:
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// 启动默认启动模式的 SecondActivity
startActivity(new Intent(this, SecondActivity.class));
}
}
public class SecondActivity extends AppCompatActivity {
private static final String TAG = "SecondActivity";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_second);
// 打印当前 Activity 的启动模式
Log.d(TAG, "Activity launch mode: " + getIntent().getFlags());
// 启动栈顶启动模式的 ThirdActivity
startActivity(new Intent(this, ThirdActivity.class));
}
}
public class ThirdActivity extends AppCompatActivity {
private static final String TAG = "ThirdActivity";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_third);
// 打印当前 Activity 的启动模式和堆栈信息
Log.d(TAG, "Activity launch mode: " + getIntent().getFlags());
Log.d(TAG, "Task stack: " + getTaskStack());
}
}
在这个例子中,MainActivity 启动了 SecondActivity,SecondActivity 又启动了 ThirdActivity。每个 Activity 中都打印了当前 Activity 的启动模式和堆栈信息。根据打印结果,我们可以观察到不同启动模式下 Activity 的运行情况和堆栈变化。