【android开发-05】android中activity的启动模式介绍

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 实例会被暂停。
【android开发-05】android中activity的启动模式介绍_第1张图片

栈顶启动模式(SingleTop):
如果 SecondActivity 已经在堆栈顶,那么当再次启动 SecondActivity 时,系统不会创建新的 SecondActivity 实例,而是通过调用已经存在的实例的 onNewIntent() 方法来通知它。如果 SecondActivity 不在堆栈顶,系统会创建一个新的 SecondActivity 实例并压入堆栈顶。
【android开发-05】android中activity的启动模式介绍_第2张图片

栈内启动模式(SingleTask):
如果 SecondActivity 不在堆栈中,系统会创建一个新的 SecondActivity 实例并压入堆栈。如果 SecondActivity 已经在堆栈中存在,那么系统不会创建新的实例,而是通过调用已经存在的实例的 onNewIntent() 方法来通知它。在这个模式下,即使系统任务切换,SecondActivity 也不会被替换。
【android开发-05】android中activity的启动模式介绍_第3张图片

单例启动模式(SingleInstance):
在这个模式下,SecondActivity 只能在一个任务的实例中存在,它始终位于堆栈的顶部。当 FirstActivity 启动 SecondActivity 时,系统会创建一个新的任务栈并把 SecondActivity 压入栈顶。即使系统任务切换,SecondActivity 也不会被替换。当再次启动 SecondActivity 时,系统不会创建新的实例,而是通过调用已经存在的实例的 onNewIntent() 方法来通知它。
【android开发-05】android中activity的启动模式介绍_第4张图片

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 的运行情况和堆栈变化。

你可能感兴趣的:(android应用开发,android)