了解了活动的生命周期就必须了解一下活动的启动模式,活动的启动并没有看起来startActivity(new Intent(A.this, B.class))那么简单。
活动的启动模式分为4种:standard、 singleTop、 singleTask、 singleInstance
有两种指定方式:
1) AndroidManifest.xml中
<activity android:name="com.hgstatuschange.SIMChange"
android:launchMode="singleInstance" />
2) .Java中
Intent mIntent = new Intent(context, SIMChange.class);
mIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
context.startActivity(mIntent);
接下来详细介绍一下这4中启动模式
1) standard(默认的)
当我们在代码没有对活动的启动模式进行显式指定时,活动的启动方式就是默认的standard。Android是在返回栈中来管理活动的,在此启动模式下,每当启动一个新的活动,它就会在返回栈中入栈,并且置于栈顶位置。系统不会关心返回栈中是否已经存在了此活动。重复启动某个活动,需要重复back才能完全退出程序。
2) singleTop
当用此方式启动一个活动时,如果要启动的活动已经在返回栈顶了,则会直接使用该活动而不创建新的活动,因此返回栈中只有一个该活动的实例。如果要启动该活动时,返回栈中有此活动但不在返回栈顶,那么还是会创建一个新的活动,返回栈中便会出现多个该活动的实例。
3) singleTask
使用singleTop模式可以很好地解决重复创建栈顶活动的问题,但是正如你在2)中所看到的,如果该活动并没有处于栈顶的位置,还是可能会创建多个活动实例的。而singleTask可以让某个活动在整个应用程序的上下文中只存在一个实例。当活动的启动模式指定为singleTask,每次启动该活动时系统首先会在返回栈中检查是否存在该活动的实例,如果发现已经存在则直接使用该实例,并把在这个活动之上的所有活动统统出栈,如果没有发现就会创建一个新的活动实例。
例子:我们创建了活动A、B。返回栈中存在A和B,B处于栈顶位置,这时候我们在B中启动A,可以发现A没有执行onCreate()而执行了onRestart()。B执行了onDestroy()被销毁了。
4) singleInstance
singleInstance模式应该算是四种启动模式中最特殊也最复杂的一个了,你也需要多花点功夫来理解这个模式。不同于以上三种启动模式,指定为singleInstance模式的活动会启用一个新的返回栈来管理这个活动(其实如果singleTask模式指定了不同的taskAffinity,也会启动一个新的返回栈)。那么这样做有什么意义呢?想象以下场景,假设我们的程序中有一个活动是允许其他程序调用的,如果我们想实现其他程序和我们的程序可以共享这个活动的实例,应该如何实现呢?使用前面三种启动模式肯定是做不到的,因为每个应用程序都会有自己的返回栈,同一个活动在不同的返回栈中入栈时必然是创建了新的实例。而使用singleInstance模式就可以解决这个问题,在这种模式下会有一个单独的返回栈来管理这个活动,不管是哪个应用程序来访问这个活动,都共用的同一个返回栈,也就解决了共享活动实例的问题。