重庆分公司,新征程启航
为企业提供网站建设、域名注册、服务器等服务
如果你的平台是面向Android3.0(API level
成都创新互联坚持“要么做到,要么别承诺”的工作理念,服务领域包括:成都网站建设、成都做网站、企业官网、英文网站、手机端网站、网站推广等服务,满足客户于互联网时代的罗甸网站设计、移动媒体设计的需求,帮助企业找到有效的互联网解决方案。努力成为您成熟可靠的网络建设合作伙伴!
11),那么恭喜你,一个函数就可以搞定:
moveTaskToFront
(int,
int)
如果你和我一样苦逼的在用2.2的平台,那么就要稍微麻烦点了,基本上是用taskAffinity +
FLAG_ACTIVITY_NEW_TASK +
FLAG_ACTIVITY_SINGLE_TOP。
先来看一下sdk怎么说的:
1.
taskAffinity:
SDK说,如果用带FLAG_ACTIVITY_NEW_TASK标志来启动一个activity,并且这个activity与当前运行的另一个task(A)的affinity名字相同,那么就这个activity就会在那个task(A)里启动。
Ok,到这还不行,人家没说会把Task_A带到前台,接着看另一个Flag
2.
FLAG_ACTIVITY_NEW_TASK
好了,重点来了:如果Task_A中已经有了Activity_2,这时候如果以FLAG_ACTIVITY_NEW_TASK来start
Activity_2,那么这个Task_A就会被带到前台。
好了,现在Task_A已经可以到前台了,剩下最后一步:Activity_2不能创建两次,这就要求同时使用下面这个flag:
3.
FLAG_ACTIVITY_SINGLE_TOP
如果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()响应,得到返回结果。
task就是一连串的操作组成的一个任务链.比如:从MMS里添加附件进入Camera,再按Camera菜单进入Gallery,再从Gallery设置图片为联系人进入Contacts.......虽然起了很多个Activity,但是通常情况下他们都属于同一个task.每个Activity可以在Manifest中配置自己是否另起一个task,默认是不另起的.
安卓中进程和Task区别:
首先看到的不是进程(process),是任务(Task)。
用终端,输ps,可以看到真正的运行中的linux process
进程是一个继承自Linux的概念,一般一个app会有一个uid,需要时会独立地开一个p
rocess。有些process是作为app的容器的,其它process是底层linux用到的。同时,虽
然很少见,也会有多个app共享一个process或者uid。
task是一个activity的栈,其中"可能"含有来自多个App的activity,也就是来自多个p
rocess,杀task一般是关闭Task的根activity引出的子树,不一定会连带kill掉对应的