你的位置:首页 > 操作系统

[操作系统]关于Android Activity启动的flag和启动模式


 

  最近因为项目需求当中,需要按一个按键,退回到指定的Activity,有可能是连续退几个Activity,第一时间想到的是多写几个finish()......然后想想就不可能,查了下Activity的相关资料,假如需要回退到Activity A,那么把A的启动模式设置为singleTask就可以了,在Manifest.

  这样写确实是没有问题的,程序返回的时候,会调用Activity栈中A上面的所有Activity的finish()方法,然后重用A。因为顺便看到了一些Activity的flags,所以看了下,觉得似乎FLAG_ACTIVITY_CLEAR_TOP也可以做到这样的效果,考虑到大家好像都和FLAG_ACTIVITY_NEW_TASK一起用,虽然看文档觉得FLAG_ACTIVITY_NEW_TASK是多余的,但是也考虑到假如回退的Activity不存在的情况下.....凑合一下吧,于是就有了:

Intent intent = new Intent(this,A.class);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP|Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);

然后崩溃开始了。。查了好久才发现:

FLAG_ACTIVITY_CLEAR_TOP: 假如已经存在了一个能够响应此intent的activity类型的实例,则这个实例之上的所有activity都将被清理以使它位于堆栈的顶部来对intent做出响应。如果此时指定的activity的加载模式为“standard”(即默认情况下),则它本身也会从堆栈中移除,并加载一个新的实例来处理到来的intent。这是因为加载模式为“standard”的activity总会创建一个新实例来处理新的intent。

也就是,这种情况下,A会先销毁再创建,因此假如重写了A的onDestroy方法,释放资源的话,会导致两次释放资源的问题,如果我们设置加载模式为singleTask,则也不需要addFlags了,直接启动就可以了。。。顺便贴一下:

FLAG_ACTIVITY_NEW_TASK: 如果已经存在了一个与新activity有着同样affinity的任务,则activity会载入那个任务之中。如果没有,则启用新任务。

另外由相关的博文也联想到,我们也可以在Application的子类中建立一个list对Activity进行管理,主要方法是继承接口,重写OnActivityCreated,OnActivityDestroy方法,分别对应list.add, list.remove方法,当我们需要返回到某个特定的Activity的时候,可以在list中对它上面的Activity进行一个个finish(),具体还没有验证,因为直接设置Android::launchmode ="singleTask"比较简单,呵呵~