Activity的四种启动模式如下:
standard、singleTop、singleTask、singleInstance
可以在AndroidManifest.xml中通过给标签指定android:launchMode模式来选择启动模式
standard模式
standard是活动的默认启动模式,在不进行显示指定的情况下,所有活动都会自动使用这种启动模式。在standard模式下,每当启动一个新的活动,它就会在返回栈中入栈,并处于栈顶的位置。对于使用standard模式的活动,系统不会在乎这个活动是否已经在返回栈中存在,每次启动都会创建该活动的一个新的实例。
singleTop模式
当启动模式指定为singleTop模式,每次启动活动时如果发现返回栈的栈顶已经是该活动,则可以直接使用它,不会再创建新的活动实例。如果该活动没有处于栈顶的位置,那么就可以再次创建该活动。
singleTask模式
当启动模式指定为singleTask模式,每次启动该活动时系统首先会在返回栈中检查是否存在该活动的实例,如果发现已经存在则直接使用该实例,并把在这个活动之上的所有活动统统出栈,如果没有发现就会创建一个新的活动实例。
singleInstance模式
当启动模式为singleInstance模式,该活动会启用一个新的返回栈来管理这个活动。这个活动的实例独立运行在单独的Task中,不允许有别的活动存在。
那么这么做有什么意义呢?假设我们程序中有一个活动是允许其他程序调用,如果我们想其他程序和我们的程序可以共享这个活动的实例,应该如何实现呢?使用前面3种启动模式肯定做不到的,因为每个应用程序都有自己的返回栈,同一个活动在不同的返回栈中入栈必然是创建了新的实例。而是用singleInstance模式就可以解决这个问题,在这种模式下会有一个单独的返回栈来管理这个活动,不管是哪个应用程序来访问这个活动,都共用的同一个返回栈,也就解决了共享活动实例的问题。
活动被回收了怎么办?
@Override
public void onCreate(Bundle savedInstanceState, PersistableBundle persistentState) {
super.onCreate(savedInstanceState, persistentState);
setContentView(R.layout.activity_main);
if(savedInstanceState != null){
String tempData = savedInstanceState.getString("data_key");
//String persistentData = persistentState.getString("data_key");
}
}
@Override
public void onSaveInstanceState(Bundle outState, PersistableBundle outPersistentState) {
super.onSaveInstanceState(outState, outPersistentState);
String tempData = "something you just typed";
outState.putString("data_key",tempData);
//String persistentData = "i don't know";
//outPersistentState.putString("data_key",persistentData);
}
最后记得在配置文件中注册当前Activity的时候加上这个属性,android:persistableMode=”persistAcrossReboots”,这样就可以给你的Activity存储一些持久化数据。当你的手机重启或者发生其他意外情况的时候,也可以给你的页面获取到相关数据。