📌  相关文章
📜  什么是 Android Activity “launchMode”?(1)

📅  最后修改于: 2023-12-03 15:06:24.095000             🧑  作者: Mango

Android Activity “launchMode”是什么?

Android中的Activity(活动)是Android应用程序的核心组件,它们通过提供界面来实现用户与应用程序的交互。每个Activity都必须在Manifest文件中声明,以便系统可以管理Activity的生命周期和使用者是否可以使用该Activity。

Activity还有一个非常重要的属性,叫做"launchMode"。这个属性用来定义activity启动时的行为,是Android中极为重要的概念。

launchMode的类型

Android中Activity的launchMode属性共有四种类型:

  1. standard(默认值):每次启动该Activity时都会创建一个新实例,无论这个实例是否已经存在。每个实例都具有自己的任务栈,用户可以在任务栈之间切换。

  2. singleTop:这种模式下,如果栈顶已经存在一个实例,那么就不会再创建新的实例。如果不存在,就会创建新的实例并放在栈顶。如果在启动该 Activity 时它已经在栈顶,那么就直接使用原来的 Activity 实例。

  3. singleTask:在这种模式下,系统会在启动该 Activity 时检查是否已经存在该 Activity 的实例。如果本实例存在,则将它上面的所有 Activity 实例全部出栈,也就是说把该 Activity 的 task 里的所有 Activity 移出栈,使该 Activity 到栈顶成为单一的 Activity 实例。如果不存在,那么在新的任务栈中创建该 Activity 的实例。

  4. singleInstance:在此模式下,系统会在一个新的任务栈中创建一个新的实例。这个模式设定采用后,将不会在该任务栈的同一个实例中创建任何其他Activity。

launchMode如何影响Activity行为

launchMode的不同类型会影响Activity的启动和销毁行为,进而影响我们的应用程序的用户体验和应用程序的占用资源情况。以下是不同类型的launchMode的影响:

  • standard模式:因为每次都会重新创建一个新的 Activity 实例,在多次启动该 Activity 的情况下,会占用更多的应用程序资源。但是,在某些场景下,比如我们需要多次打开该Activity并展示不同数据时,就不能使用其他模式了。

  • singleTop模式:由于能够重用栈顶的已有实例,所以在特定场景下,单个任务栈里面的实例数量会比较少,唯一需要注意的是,如果不是在栈顶(也就是说在这个Activity的所在的task栈中)启动的话,还是会创建新的实例并入栈。

  • singleTask模式:该模式会在同一任务栈中只有一个Activity实例,通过系统清空其上面的所有Activity实例和栈顶重用实例达到目的,也就是说,这种模式下Activity不会被实例化多个,资源占用量较少。但是对于普通的Activity,如果需要传递参数的话,需要通过Intent来打包传递,会导致Intent序列化和反序列化的性能问题。

  • singleInstance模式:这种启动模式比较特殊,其具有单独的启动任务栈,用于存储一个Activity实例。如果没有合适的任务栈,则会创建一个新的任务栈。一旦启动了这种Activity,它就会在自己的任务栈中,而不是别的任务栈中响应后续Intent。所以很多时候我们会使用这种模式来打造我们的应用。

如何设置launchMode
  • 在AndroidManifest.xml中设置
<activity
    android:name=".YourActivity"
    android:launchMode="[standard|singleTop|singleTask|singleInstance]">
    // 其他配置
</activity>

在这个例子中,YourActivity指的是Activity的名称,“[standard|singleTop|singleTask|singleInstance]”是启动模式的四种选择。在实现Activity的时候,可以通过修改AndroidManifest.xml文件来选择适合的启动模式。

  • 在代码中设置
Intent intent = new Intent(YourActivity.this, YourActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK|Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(intent);

在这个例子中,我们使用了Intent对象来启动同一个Activity,并设置Intent的FLAGS属性,使其达到特定的启动模式。例如使用了FLAG_ACTIVITY_NEW_TASK表示如果没有这个Activity的任务栈,需要创建一个新的任务栈。FLAG_ACTIVITY_CLEAR_TOP表示如果这个Activity已经存在于任务栈中,那么清除掉它上面的所有Activity实例以达到替换栈顶的目的。

总结

Android中的Activity是管理应用程序与用户之间的交互的一个非常重要的组件。launchMode属性定义了Activity的启动和销毁行为,根据不同的场景,我们可以选择适合的启动模式来达到最佳的用户体验和资源占用情况。在编写Activity的代码的同时,需要考虑是在AndroidManifest文件中配置,还是在代码中设置启动模式。