在大多数情况下,每个Android 应用程序都运行在自己的Linux 进程中。当应用程序的
某些代码需要运行时,这个进程就被创建并一直运行下去,直到系统认为该进程不再有
用为止。然后系统将回收进程占用的内存以便分配给其它的应用程序。
应用程序的开发人员必须理解不同的应用程序组件(尤其是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(它的onStop()
方法被调用)。这些进程对用户体验没有直接的影响。如果它们正确执行了Activity
生命期(详细信息可参考Activity),系统可以在任意时刻杀死进程来回收内存,
并提供给前面三种类型的进程使用。系统中通常有很多个这样的进程在运行,因
此要将这些进程保存在LRU 列表中,以确保当内存不足时用户最近看到的进程
最后一个被杀掉。
4. 空(empty)进程,不包含任何处于活动状态的应用程序组件。保留这种进程的
唯一原因是,当下次应用程序的某个组件需要运行时,不需要重新创建进程,这
样可以提高启动速度。
系统将以进程中当前处于活动状态组件的重要程度为基础对进程进行分类。请参考
Activity, Service 和 BroadcastReceiver 文档来获得有关这些组件在进程整个生命期中
是如何起作用的详细信息。每个进程类别的文档详细描述了它们是怎样影响应用程序整
个生命周期的。进程的优先级可能也会根据该进程与其它进程的依赖关系而增长。例如,
如果进程A 通过在进程B 中设置Context.BIND_AUTO_CREATE 标记或使用
ContentProvider 被绑定到一个服务(Service),那么进程B 在分类时至少要被看成与
进程A 同等重要。
分享到:
相关推荐
android 应用程序的生命周期 课件
本实验报告将深入探讨Android应用程序,尤其是Activity、Service和Intent Receiver的生命周期,并解释如何正确管理这些组件以避免不必要的进程销毁。 首先,Android应用通常在独立的Linux进程中运行。当应用需要...
Android 应用程序生命周期包括创建、启动、暂停、恢复和销毁等几个阶段。Activity 的生命周期方法包括 onCreate、onStart、onResume、onPause、onStop 和 onDestroy 等。 Android 应用程序调试技巧 Android 应用...
### Android应用程序开发知识点详解 #### 一、Android概述 Android是一种基于Linux内核的开源移动设备操作系统,由Google公司和开放手机联盟领导及开发。它主要用于触摸操作的手持设备上,如智能手机和平板电脑等...
对android应用程序的生命周期有一个很详细的介绍,非常适合初学者
让应用程序生命周期中的交互方式与您的期望完全一致,并使用图标与操作栏引导用户使用UI导航与其他应用程序功能。如今移动设备的功能已经强大到难以置信,比众多开发人员用来编写首个程序的桌面计算机还要强大得多。...
1. **Android 应用程序生命周期**: Android应用的生命周期是由一系列的回调方法构成的,如`onCreate()`, `onStart()`, `onResume()`, `onPause()`, `onStop()`, 和 `onDestroy()`。理解这些方法的执行顺序和它们的...
Activity是Android应用程序中最常见的组件之一,其生命周期包括多个状态: - **Activity的基本状态**: - **Active状态**:运行在屏幕的前台,接受用户操作。 - **Paused状态**:失去焦点但对用户仍然可见。当...
在Android应用开发中,管理Activity和Fragment的生命周期是至关重要的,因为这直接影响到应用的性能、内存使用以及用户体验。"Android-Android轻松实现生命周期绑定"的主题着重于如何更有效地处理这些组件的生命周期...
该库允许基于第二个生命周期流自动完成序列。 此功能在 Android 中很有用,因为不完整的订阅会导致内存泄漏。 你必须从一个 Observable 开始表示生命周期流。 然后使用 RxLifecycle 将序列绑定到该生命周期。 它假设...
Service的生命周期是其核心概念,理解并掌握Service的生命周期对于编写高效、稳定的Android应用至关重要。 Service的生命周期主要分为两个启动模式:bindService和startService。这两种方式对Service的生命周期有着...
在Android应用开发中,了解和掌握Android生命周期是至关重要的,因为这直接影响到应用程序的性能、稳定性和用户体验。本文将深入探讨“Android生命周期Demo”,并基于《第一行代码》这本书中的讲解,帮助新手开发者...
本项目提供了一个Android应用源码示例,适用于毕业设计或深入理解Android应用程序生命周期的学习。下面将详细讲解如何在Android中实现完全退出程序。 首先,了解Android应用的基本结构。一个Android应用通常由一个...
标题中的“Android程序研发源码Android Email程序源码.rar”表明这是一个关于Android平台上的电子邮件应用程序的源...同时,这也可以作为一个学习Android编程、深入理解Android应用程序生命周期和组件交互的好案例。
Disposer是Android开发者用来与应用程序的生命周期紧密结合,确保在正确的时间自动处理RxJava流的订阅。 Disposer是由sellmair创建的一个库,其目标是简化在Android环境中使用RxJava时的生命周期管理。在标题...
3. **第3章:Android应用程序生命周期与活动管理** - 应用程序生命周期:详述应用和活动的各个状态(如运行、暂停、停止、销毁),以及如何在生命周期方法中处理关键事件。 - 活动管理:解释如何启动、切换、返回...
在Android应用开发中,Activity是用户界面的基本单元,它的生命周期是开发者必须要深入理解的重要概念。这个"Android生命周期的演示程序"旨在帮助我们直观地了解Activity从创建到销毁的各个阶段,以及在不同操作下...
Android生命周期演示展示android活动生命周期的android应用演示。 有两个活动, MainActivity.java和secondActivity.java 。 使用logcat和log类,当两个活动中的每个回调都被调用时,此应用向用户显示。 这两个活动...