background image

一个常用的做法就是将

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 接口的实现必须要有一种线程安全的方法,这样任意线程才能同时