在四种创建模式中最长用的应该是默认方式 standard,其次是singleTask,下来是singleTop,最后是singleInstance
这几种创建模式中,往往影响的是Activity的BackStack(回退栈)。
1.标准(standard)模式基本上是后进先出,每次都会重新创建Activity,这点不多说。
2.singleInstance是最少使用的,因为这个Activity的生命周期和应用程序的生命周期是相同的, 销毁也是个问题。在MVC中,Activity类似于Controller,但我们知道基于Servlet的单例效果并不好, 比如出现信息泄露,同步等问题,才出现了后来的SpringMVC,Struts2等使用多例模式。
3.SingleTop, 如果在任务的栈顶正好存在该Activity的实例, 就重用该实例,否者就会创建新的实例并放入栈顶 (即使栈中已经存在该Activity实例,只要不在栈顶,都会创建实例)。
4.singleTask 如果在栈中已经有该Activity的实例,就重用该实例(会调用实例的onNewIntent())。重用时, 会让该实例回到栈顶,因此在它上面的实例将会被移除栈。如果栈中不存在该实例,将会创建新的实例放入栈中。
概念说道这里,再来说说SingleTask的使用方式
singleTask保证了在栈中Activity的唯一性,如果被SingleTask标记的Activity处于栈底,站定的Activity发送Intent返回到栈底时,栈中间的Activity会被清除,这个时候被标记过SingleTask的生命周期会响应的做出调整。
onNewIntent->onStart->onResume->.....
这次不会调用OnCreate,但是这里有一个问题,OnNewIntent是被调用了,但是Intent中所保存的数据却仍然还是旧数据,因此需要进一步重写
PS:来一个例子,方便大家理解吧
创建一个一个MainActivity,在Manifest中设置
<activity android:launchMode="singleTask" android:name="com.simple.launchmode.MainActivity" android:screenOrientation="portrait" />
MainActivity.java
/*** * 将activity 的创建模式设置为singletask, * 使用这个方法可以再其他activity想这个activity发送Intent时,这个Intent能够及时更新 */ @Override protected void onNewIntent(Intent intent) { super.onNewIntent(intent); setIntent(intent); //这一句必须的,否则Intent无法获得最新的数据 }
基本就是这样了,下面我们来说说SingleTask的优化搭配
<activity android:launchMode="singleTask" android:taskAffinity="com.hongkong.stationcontrol.MainActivity" android:name="com.hongkong.stationcontrol.MainActivity" android:screenOrientation="portrait" />
是的,你看见了一个
android:taskAffinity="com.hongkong.stationcontrol.MainActivity"
android:taskAffinity相当于一个标签,这个标签是任务名称,SingleTask从字面意思理解是单任务,这里是任务的名称,前面所说的而保持Activity的唯一性只是这个单任务的一个子集,默认情况下任务都是同一个(按照packageName)来设置的,这样他的优势并没有完全发挥,因此要使用
android:taskAffinity="com.hongkong.stationcontrol.MainActivity"
重新创建一个任务,这样实现了Activity的唯一性的同时,也实现了单任务。
2014-11-21更新~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
在使用过程中发现了问题,被设置为singleTask的Activity如果是某个Activity的子Activity(即通过satrtActivityForResult启动),那么就会出现父OnActivityResult被提前调用的情况,因此来说,singleTask不适合用来做子Activity。出现这种情况的原因是任务栈是不同。为了效率好一些,建议子Activity使用singleTop.
try do it!