singleTop的优点与缺点:
使用singleTop 模式可以很好地解决重复创建栈顶活动的问题,
但是如果该活动并没有处于栈顶的位置,还是可能会创建多个活动实例的。
singleTask:
那么有没有什么办法可以让某个活动在整个应用程序的上下文中只存在一个实例呢?
这就要借助singleTask 模式来实现了。当活动的启动模式指定为singleTask,
每次启动该活动时系统首先会在返回栈中检查是否存在该活动的实例,
如果发现已经存在则直接使用该实例,并把在这个活动之上的所有活动统统出栈,
如果没有发现就会创建一个新的活动实例。
我们还是通过代码来更加直观地理解一下。
1、修改AndroidManifest.xml 中FirstActivity 的启动模式
1 <activity 2 android:name=".FirstActivity" 3 android:launchMode="singleTask" 4 android:label="This is FirstActivity" > 5 <intent-filter> 6 <action android:name="android.intent.action.MAIN" /> 7 <category android:name="android.intent.category.LAUNCHER" /> 8 </intent-filter> 9 </activity>
2、在FirstActivity 中添加onRestart()方法,并打印日志
1 @Override 2 protected void onRestart() 3 { 4 super.onRestart(); 5 Log.d("FirstActivity", "onRestart"); 6 }
3、在SecondActivity 中添加onDestroy()方法,并打印日志
1 @Override 2 protected void onDestroy() 3 { 4 super.onDestroy(); 5 Log.d("SecondActivity", "onDestroy"); 6 }
4、重新运行程序,在FirstActivity 界面点击按钮进入到SecondActivity
5、在SecondActivity 界面点击按钮,又会重新进入到FirstActivity
在SecondActivity 中启动FirstActivity 时,会发现返回栈中已经存在一个FirstActivity 的实例,
并且是在SecondActivity 的下面,于是SecondActivity 会从返回栈中出栈,
而FirstActivity 重新成为了栈顶活动,
因此FirstActivity的onRestart()方法和SecondActivity 的onDestroy()方法会得到执行。
现在返回栈中应该只剩下一个FirstActivity 的实例了,按一下Back 键就可以退出程序