在“Android性能优化”中有这么一条规则:
复用、回收Activity对象:
临时的activity及时finish,
主界面Activity启动模式设置singleTask,一般界面Activity的启动模式设置为
singleTop。
Activity的启动模式:
Activity有4种启动方式,分别是:
① standard
② singleTop
③ singleTask
④ singleInstance
可以根据实际的需求为Activity设置对应的启动模式,从而可以避免创建大量重复的Activity(造成占用手机内存)等问题。
<activity
android:name="com.lzy.androidstoragedemo.activity.HomeActivity"
<span style="background-color: rgb(255, 255, 51);">android:launchMode="singleTask"</span>
android:label="@string/app_name" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity android:name="com.lzy.androidstoragedemo.activity.DownTimeActivity"
<span style="background-color: rgb(255, 255, 51);">android:launchMode="singleTop" </span>>
</activity>
下面就这四种模式做下总结性介绍:
standard(系统默认的启动方式):
这种启动模式是Activity的“标准启动模式”,也是Activity的默认启动模式,可以不用写配置。在这个模式下,都会默认创建一个新的实例。因此,在这种模式下,可以有多个相同的实例,也允许多个相同Activity叠加,因此一般情况下我们不采用这样的启动方式,这样不但重建Activity对象造成耗时,而且也会造成内存的浪费。
singleTop:
如果在任务的栈顶正好存在该Activity的实例,就重用该实例,而不会创建新的Activity对象,不过它会调用onNewIntent()方法。如果栈顶部不存在就会创建新的实例并放入栈顶(即使栈中已经存在该Activity实例,只要不在栈顶,都会创建实例)。会回调onNewIntent()方法。
应用场景:从上面的介绍中,我们可以推断出singleTop启动模式适合于一些不常用的Activity页面,比如“找回密码”、“设置界面”等。
singleTask:
如果在栈中已经有该Activity的实例,就重用该实例(会调用实例的onNewIntent())。重用时,会让该实例回到栈顶,因此在它上面的实例将会被移除栈。如果栈中不存在该实例,将会创建新的实例放入栈中。
和singleTop在名字上即可看出区别,即singleTop每次只检测当前栈顶的Activity是否是我们需要请求创建的,而 singleTask则会检测栈中全部的Activity对象,从上向下,如果检测到是我们所请求的则会消灭此Activity对象上面的对象,直接把检 测到的我们需要的Activity置为栈顶。
应用场景:其在App内部适合作为程序入口点。从上面的介绍可以看出我们的App项目中调用较多的Activity页面使用于该启动模式,在项目中我们哪个Activity用的多?当然是首界面HomeActivity调用的较多,因此在首界面Activity的启动模式适用于改启动模式。当然其他利用较多的Activity也应该设置为该启动模式。
与singleTask模式的区别是存放singleInstance模式窗口对象的回退栈不能有其他任何窗口对象。因此如果该窗口不存在,则要新建任务Task来存放该singleInstance模式窗口。也就是说getTaskId()会发现任务id发生了变化。
此启动模式和我们使用的浏览器工作原理类似,在多个程序中访问浏览器时,如果当前浏览器没有打开,则打开浏览器,否则会在当前打开的浏览器中访问。此模式会节省大量的系统资源,因为他能保证要请求的Activity对象在当前的栈中只存在一个。
应用场景:singleInstance有一个重要的作用:作为外部App调用自己客户端程序的入口。比如说,使用微信调起自己的客户端某个页面,不做任何处理的情况下,按下回退或者当前Activity.finish(),页面不会停留在自己的客户端而是返回到微信的客户端页面。但是如果这个页面的启动模式设置为singleTask,当按下返回键或者Activity。finish(),页面都会停留在自己的客户端(因为自己的Application回退栈不为空),这明显不符合逻辑的。产品的要求是,回退必须回到微信客户端,而且要保证不杀死自己的Application.因此,显然其他的其他的启动模式都不具备这个功能。OK,本篇博文到此结束,如有写的不准确地地方还请多多指点。