• 沒有找到結果。

启动模式以及启动标记

在文檔中 android 中文文档什么是 (頁 50-54)

你控制活动和任务通信的最主要的方法是通过设置启动模式的属性以及意图相 应的标记。这两个参数能以不同的组合来共同控制活动的启动结果,这在相应的 文档里有描述。这里我们只描述一些通用的用法以及几种不同的组合方式。

你最通常使用的模式是singleTop(除了默认为standard 模式)。这不会对 任务产生什么影响;仅仅是防止在栈顶多次启动同一个活动。

singleTask模式对任务有一些影响:它能使得活动总是在新的任务里被打开

(或者将已经打开的任务切换到前台来)。使用这个模式需要加倍小心该进程是

如何和系统其他部分交互的,它可能影响所有的活动。这个模式最好被用于应用 程序入口活动的标记中。(支持MAIN活动和LAUNCHER分类)。

singleInstance 启动模式更加特殊,该模式只能当整个应用只有一个活动时 使用。

有一种情况你会经常遇到,其它实体(如搜索管理器SearchManager 或者 通

知管理器NotificationManager)会启动你的活动。这种情况下,你需要使用

Intent.FLAG_ACTIVITY_NEW_TASK 标记,因为活动在任务(这个应用/任务 还没有被启动)之外被启动。就像之前描述的一样, 这种情况下标准特性就是 当前和任务和新的活动的亲和性匹配的任务将会切换到前台,然后在最顶端启动 一个新的活动。当然,你也可以实现其它类型的特性。

一个常用的做法就是将Intent.FLAG_ACTIVITY_CLEAR_TOP 和NEW_TASK 一起使用。这样做,如果你的任务已经处于运行中,任务将会被切换到前台来, 在 栈里的所有的活动除了根活动,都将被清空,根活动的onNewIntent(Intent) 方 法传入意图参数后被调用。当使用这种方法的时候 singleTop 或者

singleTask启动模式经常被使用,这样当前实例会被置入一个新的意图,而

不是销毁原先的任务然后启动一个新的实例。

另外你可以使用的一个方法是设置活动的任务亲和力为空字串(表示没有亲和 力),然后设置finishOnBackground属性。 如果你想让用户给你提供一个单独 的活动描述的通知,倒不如返回到应用的任务里,这个比较管用。要指定这个属 性,不管用户使用BACK还是HOME,活动都会结束;如果这个属性没有指定,

按HOME键将会导致活动以及任务还留在系统里,并且没有办法返回到该任务 里。

请确保阅读过文档启动模式属性(launchMode attribute)以及 意图标记(Intent

flags) ,关注这些选项的详细信息。

像前面描述的一样,进程的属性被用来控制那些有特殊应用组件运行的进程。注

应用程序的开发人员必须理解不同的应用程序组件(尤其是Activity, Service, 和

BroadcastReceiver)是如何影响应用程序进程生命周期的,这是很重要的一件

事情。不正确地使用这些组件可能会导致系统杀死正在执行重要任务的应用程 序进程。

一个常见的进程生命周期bug的例子是BroadcastReceiver, 当

BroadcastReceiver在BroadcastReceiver.onReceive()方法中接收到一个Intent 时,它会启动一个线程,然后返回。一旦它返回,系统将认为BroadcastReceiver 不再处于活动状态,因而BroadcastReceiver所在的进程也就不再有用了(除非 该进程中还有其它的组件处于活动状态)。因此,系统可能会在任意时刻杀死进 程以回收内存。这样做的话,进程中创建(spawned)出的那个线程也将被终止。

对这个问题的解决方法是从BroadcastReceiver启动一个服务,让系统知道进程 中还有处于活动状态的工作。为了决定在内存不足时让系统杀死哪个进程,

Android 根据每个进程中运行的组件以及组件的状态把进程放入一个”重要性分

级(importance hierarchy)”中。进程的类型包括(按重要程度排序):

1. 前台(foreground)进程,与用户当前正在做的事情密切相关。不同的 应用程序组件能够通过不同的方法使它的宿主进程移到前台。当下面任何 一个条件满足时,可以考虑将进程移到前台:

1. 进程正在屏幕的最前端运行一个与用户交互的Activity (它的 onResume()方法被调用)

2. 进程有一正在运行的BroadcastReceiver (它的 BroadcastReceiver.onReceive()方法正在执行)

3. 进程有一个Service,并且在Service的某个回调函数

(Service.onCreate(), Service.onStart(), 或 Service.onDestroy()) 内有正在执行的代码。

1. 可见(visible)进程,它有一个可以被用户从屏幕上看到的Activity,但

不在前台(它的onPause()方法被调用)。举例来说,如果前台的Activity 是一个对话框,以前的Activity隐藏在对话框之后,就可能出现这种进程。

这样的进程特别重要,一般不允许被杀死,除非为了保证前台进程的运行 不得不这样做。

2. 服务(service)进程,有一个已经用startService() 方法启动的Service。

虽然这些进程用户无法直接看到,但它们做的事情却是用户所关心的(例 如后台MP3回放或后台网络数据的上传下载)。因此,系统将一直运行 这些进程除非内存不足以维持所有的前台进程和可见进程。

3. 后台(background)进程, 拥有一个当前用户看不到的Activity(它的

时刻杀死进程来回收内存,并提供给前面三种类型的进程使用。系统中通 常有很多个这样的进程在运行,因此要将这些进程保存在LRU 列表中,

以确保当内存不足时用户最近看到的进程最后一个被杀掉。

4. 空(empty)进程,不包含任何处于活动状态的应用程序组件。保留这种 进程的唯一原因是,当下次应用程序的某个组件需要运行时,不需要重新 创建进程,这样可以提高启动速度。

系统将以进程中当前处于活动状态组件的重要程度为基础对进程进行分类。请参 考Activity, Service 和 BroadcastReceiver文档来获得有关这些组件在进程整 个生命期中是如何起作用的详细信息。每个进程类别的文档详细描述了它们是怎 样影响应用程序整个生命周期的。进程的优先级可能也会根据该进程与其它进程 的依赖关系而增长。例如,如果进程A 通过在进程B中设置

Context.BIND_AUTO_CREATE标记或使用ContentProvider被绑定到一个服

务(Service),那么进程B在分类时至少要被看成与进程A同等重要。

在文檔中 android 中文文档什么是 (頁 50-54)

相關文件