重用Activity activity task taskAffinity

来源:互联网 发布:cosplay的软件 编辑:程序博客网 时间:2024/06/05 16:03

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

欢迎指正^-^  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) {


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

0 0
原创粉丝点击