一个常用的做法就是将
Intent.FLAG_ACTIVITY_CLEAR_TOP 和 NEW_TASK 一起使
用。这样做,如果你的任务已经处于运行中,任务将会被切换到前台来
, 在栈里的所有的活
动除了根活动,都将被清空,根活动的
onNewIntent(Intent) 方法传入意图参数后被调用。当
使用这种方法的时候
singleTop 或者 singleTask 启动模式经常被使用,这样当前实例会被置
入一个新的意图,而不是销毁原先的任务然后启动一个新的实例。
另外你可以使用的一个方法是设置活动的任务亲和力为空字串(表示没有亲和力),
然后设置
finishOnBackground 属性。 如果你想让用户给你提供一个单独的活动描述的通知,
倒不如返回到应用的任务里,这个比较管用。要指定这个属性,不管用户使用
BACK 还是
HOME,活动都会结束;如果这个属性没有指定,按 HOME 键将会导致活动以及任务还留
在系统里,并且没有办法返回到该任务里。
进程
在
Android 中,进程是应用程序的完整实现,而不是用户通常了解的那样。他们主要用
途很简单:
◆提高稳定性和安全性,将不信任或者不稳定的代码移动到其他进程。
◆可将多个.apk 包运行在同一个进程里减少系统开销。
◆帮助系统管理资源,将重要的代码放在一个单独的进程里,这样就可以单独销毁应用程
序的其他部分。
像前面描述的一样,进程的属性被用来控制那些有特殊应用组件运行的进程。注意这个
属性不能违反系统安全:
如果两个.apk 包不能共享同一个用户 ID,却试图运行在通一个进
程里,这种情况是不被允许的,事实上系统将会创建两个不同的进程。
线程
每个进程包含一个或多个线程。多数情况下,
Android 避免在进程里创建多余的线程,
除非它创建它自己的线程,我们应保持应用程序的单线程性。
一个重要的结论就是所有呼
叫实例
, 广播接收器, 以及 服务的实例都是由这个进程里运行的主线程创建的。
注意新的线程不是为活动,广播接收器,服务或者内容提供器实例创建:这些应用程
序的组件在进程里被实例化(除非另有说明,都在同一个进程处理),实际上是进程的主
线程。这说明当系统调用时这些组件(包括服务)不需要进程远距离或者封锁操作(就像网
络呼叫或者计算循环),因为这将阻止进程中的所有其他组件。你可以使用标准的线程
类
或者
Android 的 HandlerThread 类去对其它线程执行远程操作。
这里有一些关于创建线程规则的例外:
呼叫
IBinder 或者 IBinder 实现的接口,如果该呼叫来自其他进程,你可以通过线程发
送的
IBinder 或者本地进程中的线程池呼叫它们,从进程的主线程呼叫是不可以的。特殊情
况下,
,呼叫一个服务 的 IBinder 可以这样处理。(虽然在服务里呼叫方法在主线程里已经完
成。)这意味着
IBinder 接口的实现必须要有一种线程安全的方法,这样任意线程才能同时