Android singleTask+askAffinity的使用方式

在四种创建模式中最长用的应该是默认方式 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!




你可能感兴趣的:(android创建(启动)模式)