Android应用的主要构建块之一是Activity,它负责处理与用户的交互。启动Activity的方式有多种,其中包括四种不同的启动模式,即standard、singleTop、singleTask和singleInstance。每个启动模式都有其独特的用途,可以根据应用的需求来选择使用哪种。
一、standard
standard是默认的启动模式。每次启动Activity时,都会创建一个新的实例,并将其放入Task栈中。如果Activity已经存在于Task栈中,那么就会创建一个新的实例并放入Task栈的顶部。 这个模式适用于独立的Activity。如果你需要从其他Activity启动一个新的Activity,而新的Activity不需要与前一个Activity进行通信,那么就可以使用这个模式。 代码示例: ``` //在调用startActivity时不添加任何FLAG Intent intent = new Intent(this, MainActivity.class); startActivity(intent); ```
二、singleTop
singleTop模式保证了Activity实例的唯一性。如果要启动一个位于Task栈顶部的Activity,那么就不会创建新的实例,而是会复用已经存在的实例。如果Activity不存在于Task栈顶部,那么就会创建一个新的实例放入Task栈中。 这个模式适用于需要在Activity的生命周期内处理多个Intent的情况。当Activity已经存在时,如果新的Intent可以通过onNewIntent()方法处理,那么就会复用已经存在的实例,并调用onNewIntent()方法。 代码示例: ``` //将Intent设置为singleTop模式 Intent intent = new Intent(this, MainActivity.class); intent.setFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP); startActivity(intent); ```
三、singleTask
singleTask模式保证了整个应用程序中只有一个实例。如果要启动一个Activity时,如果该Activity已经存在于Task栈中,那么就会将该Activity上面的所有Activity全部出栈,使得该Activity成为栈顶的Activity;如果该Activity不存在于Task栈中,那么就会创建一个新的Task栈,然后将该Activity放入其中。 这个模式适用于承载应用程序主界面的Activity,例如浏览器的主界面。可以通过在AndroidManifest.xml文件中设置taskAffinity属性,来使得创建的Task栈与其他Task栈分离。 代码示例: ``` //设置Activity为singleTask模式
```
四、singleInstance
singleInstance模式是最为严格的模式,保证整个系统中只有一个实例。与singleTask模式类似,如果要启动一个Activity时,如果该Activity已经存在于Task栈中,那么就会将该Activity上面的所有Activity全部出栈,使得该Activity成为栈顶的Activity;但不同的是,该Activity所在的Task栈不会与其他的Task栈共享,而是会在一个新的Task栈中启动该Activity。 这个模式适用于一些独立的、全局的、无需与其他Activity交互的Activity,例如系统的电话应用程序。由于该模式的严格要求,开发人员在使用时需要注意与其他Activity的交互。 代码示例: ``` //设置Activity为singleInstance模式
``` 总结: 四种启动模式各有特点,可以根据应用的需求来选择使用哪种。如果需要多次创建Activity实例并且不需要与其他Activity进行交互,那么可以使用standard模式;如果需要处理多个Intent并且需要复用Activity实例,那么可以使用singleTop模式;如果需要整个应用程序中只有一个Activity实例,那么可以使用singleTask模式;如果需要整个系统中只有一个Activity实例,那么可以使用singleInstance模式。 无论使用哪种启动模式,都需要注意Activity的生命周期和处理与其他Activity之间的交互。