Android中怎么切换task到前台

[背景]

当一个业务流程涉及到多个task之间的交互,如一个Task_A中的Activity_1 startActivityForResult() 了一个Activity_2, Activity_2启动另一个Task_B并且期望利用Task_B运行的结果setResult()返回给Activity_1。

TaskRecord如下图所示:

Android中怎么切换task到前台。
[问题]

Task_B取得result之后,需要把Task_A带到前台(active),这样Activity_1才能响应(onActivityResult)到Activity_2返回(setResult)的结果。

现在的问题就在于,Task_B并不一定能够退出(Activity_3其可能其他程序,如browser等),从而把Task_A带到前台;又或者Task_A和Task_B中又夹杂了其他的Task(你知道,长按home键你可以做得出来),以至于调用Task_B.moveTaskToBack()也不能解决问题。

 

[解决方案]

如果你的平台是面向Android3.0(API level 11),那么恭喜你,一个函数就可以搞定:

moveTaskToFront 

http://developer.android.com/reference/android/app/ActivityManager.html#moveTaskToFront(int, int)

Android中怎么切换task到前台。


 

如果你和我一样苦逼的在用2.2的平台,那么就要稍微麻烦点了,基本上是用taskAffinity +FLAG_ACTIVITY_NEW_TASK + FLAG_ACTIVITY_SINGLE_TOP

先来看一下sdk怎么说的:

1. taskAffinity:

Android中怎么切换task到前台。
SDK说,如果用带FLAG_ACTIVITY_NEW_TASK标志来启动一个activity,并且这个activity与当前运行的另一个task(A)的affinity名字相同,那么就这个activity就会在那个task(A)里启动。

Ok,到这还不行,人家没说会把Task_A带到前台,接着看另一个Flag

 

2. FLAG_ACTIVITY_NEW_TASK

Android中怎么切换task到前台。
好了,重点来了:如果Task_A中已经有了Activity_2,这时候如果以FLAG_ACTIVITY_NEW_TASK来start Activity_2,那么这个Task_A就会被带到前台

好了,现在Task_A已经可以到前台了,剩下最后一步:Activity_2不能创建两次,这就要求同时使用下面这个flag:

 

3. FLAG_ACTIVITY_SINGLE_TOP
Android中怎么切换task到前台。
如果Activity_2在Task的顶端,那么这个Activity_2就不会被再此创建,而是走onNewIntent.

 

至此,结合上面3个特性,问题得以解决。结合代码,流程如下:

1. 在androdiManifest.xml中添加Activity_2的taskAffinity name与Task_A相同(也就是与Activity_1的taskAffinity名字相同),如android:taskAffinity = "android.task.calendar"。

2. 在Task_B启动前,Activity_1先启动Activity_2并要求返回结果,startActivityForResult().

3. Task_B中的Activity_4取得所需数据后,保存好(intent,或其他方法),然后startActivity(Activity_2),并带上(FLAG_ACTIVITY_NEW_TASK | FLAG_ACTIVITY_SINGLE_TOP)标志。

4. Task_A被带到前台,并且调用到Activity_2::onNewIntent().

5. Activity_2取得之前保存的信息(从Intent或其他地方),调用setResult(),然后finish().

6. Activity_1中的onActivityResult()响应,得到返回结果。

 

总结下:

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值