处理home按键清空Activity所在的Task堆栈

来源:互联网 发布:网上礼佛软件 编辑:程序博客网 时间:2024/06/08 06:05

长虹厂商反馈的问题:

  当通过intent外部调起的详情页面,按home键回到launcher,再次通过intent调起播放页面,按back键返回,会发现上次调用过的详情页。

  想了想,这个问题其实是Activity和Task堆栈的问题。正好回顾一下task,launch mode这几个概念,高手直接略过。

  Task是执行用户工作,与用户交互的一组Activity的集合。 当用户在应用启动器中触击一个应用的图标,系统会内存中寻找有没有该应用打开过的堆栈

  如果有,这个应用就会回到前台。如果没有这个应用的任务存在,那么创建一个新的 task,这个应用的 “main” Activity打开,并且作为这个 task栈的根 activity。Activity被安排到同一个栈 (back stack)中,其中的 activity按顺序的打开的。

  在同一个应用中,打开Activity和按back按键,Activity在堆栈中的变化过程如下:

  一般情况下,我们不用担心Activity怎么和task关联,不需要关系Activity如何存在于stack中。但是比如我们现在遇到的问题,厂商明显是想中断这种常态行为,希望按home键离开应用的task时,应用自动清除task内的所有activity。

  这个时候,我们就需要使用launch mode和Intent flag来改变activity与task的这种默认行为。

  关于launch mode和intent flag不在做详细的解释,参考这里,讲解的很细致。

  Activity的四种加载模式 http://marshal.easymorse.com/archives/2950

  android之intent的Flag详解 http://hi.baidu.com/jieme1989/item/6e5f41d3f65be848ddf9beb9

  画一个流程图,复现厂商说的问题

既然是要求按home按键,清空堆栈。可以有两种做法。

 1.监听Home按键,当用户按下Home按键时,结束自己的进程。

这里有两个问题:

第一个就是Home按键的捕获,一般是捕获不到的。

解决方案:可以使用一个线程去监视系统日志(有点笨,不过还算有效)

第二个是如果是android厂商的话,一般都会修改Framework,可以让他们在home键按下的时候,发一个广播出来。App

可以根据此广播,处理相应的逻辑。

  2.可以使用launch Mode配合Intent Flag完成

第三方调起应用时,可以在getIntent()中,加入Intent.FLAG_ACTIVITY_CLEAR_TASK ,同时调起的Activity的launch mode设置为singleTask

也就是第三方调起的每个页面,在启动前都会对Task进行清空,从而避免上述问题。



  原文链接:http://www.67tgb.com/?p=628

  转载注明:望月听涛

原创粉丝点击