此博客是个人学习的总结,仅作参考
欢迎指正^-^ bulasuo@foxmail.com
如何做到正确的重用activity? 如果有activity a 是一个相册集 而每个相册集点击进入 activity b 该相册集的 照片列表,一般我们应该要重用 activity a 和b的。否则每次都要重新加载,就算从缓存加载也是浪费计算,现在手机的RAM都达到3G,4G我们要好好利用 得到更好的用户体验,不要每次进acyivity b 总是看到一张张图片加载的过程。
看下面的4种启动模式,只有第4个是总是重用, 重用的正确做法,把该activity 设成singleInstance 然后从下面的第1条看到底。或者设成singleTask:看总结。
activity的启动模式
1.singleTop :看要启动的activity是否在栈顶,在则重用,不在则新建
2.standard :每次都新建
3.singleTask :每次都重用该activity且清除其之上所有activity
4.singleInstance :单独生成一个task,该task只能有该activity
Intent.FLAG_ACTIVITY_NEW_TASK 与taskAffinity一起用,看下面第4条。
1.根activity的back键要拦截并且重定义为Home键功能
public boolean onKeyDown(int keyCode, KeyEvent event) {if(keyCode == KeyEvent.KEYCODE_BACK && event.getAction() ==KeyEvent.ACTION_DOWN) {
(Intent.FLAG_ACTIVITY_NEW_TASK).addCategory(Intent.CATEGORY_HOME));
return true;
}
return super.onKeyDown(keyCode, event);
}
2.需要重用的activity设为singleInstance 并且拦截他的 back键 重定义为要跳转到的activity
3.back键默认是要finish当前activity的
4.FLAG为FLAG_ACTIVITY_NEW_TASK的时候会查找是否与他本身有相同taskAffinity的task,如有则
宿主到该task 否则 新建本身的taskAffinity 的task。
5.一个task为 home键右边任务栏的一个任务的选项卡(singleInstance除外),task之间可以互相
叠加,重新排列
6.taskAffinity不设置则 一个application有一个task,所有activity都宿主到该task,task也有
taskAffinity,默认值为根activity的taskAffinity,而根activity的taskAffinity默认为
application的taskAffinity,application的taskAffinity未设置 则为 包名。
7.singleInstance的activity会新建task但是不会另建任务选项卡,现在模拟下面这种情况:
新建application,依次启动activity a、b、c 这时默认task堆栈《task是堆栈先进后出、队列是
先进先出》为abc ,这时启动singleInstance 的activity d、 变成abcd 并且abc为默认task,d单
独一个task,且该task有且仅有一个activity d。这时d startActivity 到 b, 这时会变成 dab《
为什么会这样请看第5条》,d为一个task,ab为默认task,back键按2次会回到d,<如果d 启动activity e 则变成 dabce d为一个task abce为默认task> 但是你想想 a
activity是application的根activity通常是登入界面 或者 欢迎界面 而从a back键后 居然回到
d!这会让用户感到奇怪。怎么处理? 看上面 第一条 重定义 a 的back键为home键 或者 a的back
键 销毁所有。
但是如果singleInstanceactivity为展现用户信息的页面 就不一样了,如果用户变更了账户登入,而singleInstance还是上一个账户的页面!所以要在onResume里加载或者重新加载数据。
总结:只能重用task里有的activity,singleTask之上的activity都销毁。