天天看点

重用Activity activity task taskAffinity

此博客是个人学习的总结,仅作参考

欢迎指正^-^  [email protected]

如何做到正确的重用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) {

this.startActivity(new Intent(Intent.ACTION_MAIN).setFlags

(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都销毁。