引言

应用程序组件有一个生命周期——一开始Android实例化他们响应意图,直到结束实例被销毁。在这期间,他们有时候处于激活状态,有时候处于非激活状态;对于活动,对用户有时候可见,有时候不可见。组件生命周期将讨论活动、服务、广播接收者的生命周期——包括在生命周期中他们可能的状态、通知状态改变的方法、及这些状态的组件寄宿的进程被终结和实例被销毁的可能性。

上篇Android组件生命周期(一)讲解了论活动的生命周期及他们可能的状态、通知状态改变的方法。本篇将介绍服务和广播接收者的生命周期:

  • 服务生命周期
  • 广播接收者生命周期

1、服务生命周期

一个服务可以用在两个方面:

  • 它可以启动且允许一直运行直到有人停止它,或者它自己停止。在这种模式,通过调用Context.startService()启动服务及通过调用Context.stopService()停止服务。服务也可以通过调用Service.stopSelf()或Service.stopSelfResult()停止自己。仅需要调用一次stopService()停止服务,而不管调用startService()了多少次。
  • 通过使用相关接口可以编程地操作服务。客户端建立与Service对象的一个连接及使用该连接调入服务。连接通过调用Context.bindService()建立,通过调用Context.unbindService()关闭。多个客户端可以绑定到同一个服务。如果服务尚未启动,bindService()可以选择启动它。

这两种模式并不是完全分离的。你可以绑定到一个用startService()启动的服务。例如,一个后台音乐服务可以通过使用定义了音乐播放的Intent对象调用startService()启动。直到后来,用户可能想对播放器做一些控制或者获取当前歌曲的一些信息,一个活动将调用bindService()与服务建立连接。在这种情况下,实际上直到最后一个绑定关闭stopService()并不会停止。

像活动一样,一个服务也有生命周期方法,你可以执行监视它的状态改变。但是比活动的生命周期方法更少,只有三个且它们是公有的(public)而不是受保护的(protected)(说明:活动的生命周期方法是protected的):

  • void onCreate()
  • void onStart(Intent intent)
  • void onDestory()

通过这三个方法,你可以监视服务生命周期的两个嵌套循环:

  • 服务的整个生命时间(entire lifetime),从调用onCreate()到相应地调用onDestory()。像一个活动一样,服务在onCreate()中做一些初始设置,且在中释放所有的资源。例如,一个音乐播放服务可以在onCreate()中创建线程,然后在onDestory()中停止线程。
  • 服务的活跃生命时间(active lifetime),从调用onStart()开始。这个方法传递参数是传送给startService()的Intent对象。音乐服务将打开Intent,了解播放哪个音乐并且开始播放。 
    没有相应的回调方法,因为服务停止没有onStop()方法。

startService()和onDestory()被所有服务调用,不管是通过Context.startService()启动还是通过Context.bindService()启动的。然而,onStart()仅被通过startService()启动的服务调用。

如果一个服务允许别的绑定到它,有一些额外的回调方法来实现它:

  • IBinder onBind(Intent intent)
  • boolean onUnbind(Intent intent)
  • void onRebind(Intent intent)

onBind()回调传递的参数是传给bindService()的Intent对象,onUnbind()回调传递的参数是传给unbindService()的Intent对象。如果服务允许绑定,onBind()返回客户端与服务交互的通信通道。onUnbind()方法可以要求调用onRebind(),如果一个新的客户端连接到服务。

下图解释了服务的回调方法。虽然,它分离了由startService()启动的服务和由bindService()启动的服务,记住任何服务,无论它怎么启动的,都可能允许客户端绑定到它,因此任何服务可能接收onBind()和onUnbind()调用。

2、广播接收者生命周期

一个广播接收者有一个回调方法:void onReceive(Context curContext, Intent broadcastMsg)。当一个广播消息到达接收者是,Android调用它的onReceive()方法并传递给它包含消息的Intent对象。广播接收者被认为仅当它执行这个方法时是活跃的。当onReceive()返回后,它是不活跃的。

有一个活跃的广播接收者的进程是受保护的,不会被杀死。但是系统可以在任何时候杀死仅有不活跃组件的进程,当占用的内存别的进程需要时。

这带来一个问题,当一个广播消息的响应时费时的,因此应该在独立的线程中做这些事,远离用户界面其它组件运行的主线程。如果onReceive()衍生线程然后返回,整个进程,包括新的线程,被判定为不活跃的(除非进程中的其它应用程序组件是活跃的),将使它处于被杀的危机。解决这个问题的方法是onReceive()启动一个服务,及时服务做这个工作,因此系统知道进程中有活跃的工作在做。

 

作者:吴秦
出处:http://www.cnblogs.com/skynet/
本文基于署名 2.5 中国大陆许可协议发布,欢迎转载,演绎或用于商业目的,但是必须保留本文的署名吴秦(包含链接).

Android组件生命周期(二)的更多相关文章

  1. Android组件生命周期(一)

    引言 应用程序组件有一个生命周期——一开始Android实例化他们响应意图,直到结束实例被销毁.在这期间,他们有时候处于激活状态,有时候处于非激活状态:对于活动,对用户有时候可见,有时候不可见.组件生 ...

  2. Android组件生命周期(三)

    Android系统试图尽可能长地保持一个应用程序进程,但是当内存低时它最终还是需要移除旧的进程.为了决定保持哪个进程及杀死哪个进程,Android将每个进程放入一个基于运行于其中的组件的重要性等级和这 ...

  3. Angular组件——组件生命周期(二)

    一.view钩子 view钩子有2个,ngAfterViewInit和ngAfterViewChecked钩子. 1.实现ngAfterViewInit和ngAfterViewChecked钩子时注意 ...

  4. android核心系列--1,组件生命周期

    一,进程模型及进程托管 1,一个APP应用是由一个或多个组件构成的,这些组件可以运行在一个进程中,也可以分别运行在多个进程中: 进程的构造和销毁是由系统全权负责的. 2,一个应用进程只有一个应用环境对 ...

  5. Android应用常规开发技巧——善用组件生命周期

    数据管理 对于仅仅读数据.一种经常使用的管理模式是在onCreate函数中进行数据的载入,直到组件的onDestory函数被调用时在进行释放. // 缓存仅仅读的数据 private Object r ...

  6. vue 源码详解(二): 组件生命周期初始化、事件系统初始化

    vue 源码详解(二): 组件生命周期初始化.事件系统初始化 上一篇文章 生成 Vue 实例前的准备工作 讲解了实例化前的准备工作, 接下来我们继续看, 我们调用 new Vue() 的时候, 其内部 ...

  7. Android 进程生命周期 Process Lifecycle

    Android 进程生命周期 Process Lifecycle 进程的生命周期 Android系统会尽力保持应用的进程,但是有时为了给新的进程和更重要的进程回收一些内存空间,它会移除一些旧的进程. ...

  8. Castle IOC容器组件生命周期管理

    主要内容 1.生命处理方式 2.自定义生命处理方式 3.生命周期处理 一.生命处理方式 我们通常创建一个组件的实例使用new关键字,这样每次创建出来的都是一个新的实例,如果想要组件只有一个实例,我们会 ...

  9. 对于Android Service 生命周期进行全解析

    应用程序组件有一个生命周期——一开始Android实例化他们响应意图,直到结束实例被销毁.在这期间,他们有时候处于激活状态,有时候处于非激 活状态:对于活动,对用户有时候可见,有时候不可见.组件生命周 ...

随机推荐

  1. zf-启动项目报错Server 127.0.0.1 has no instance named dlx 解决办法

    由于百度出来的看不明白,于是我就在群里问,吴善如经理说:你这个问题我上次给李宽看过,用端口连,把instance去掉 然后我去掉之后 项目过程能够成功运行了,原来是这样

  2. hql 链接查询

    第一部分.连接查询 一.内连接 内连接查询操作列出与连接条件匹配的数据行,它使用比较运算符比较被连接列的列值.内连接分三种: 1.等值连接:在连接条件中使用等于号(=)运算符比较被连接列的列值,其查询 ...

  3. listView上拉刷新下拉加载

    xlistview_header.xml <?xml version="1.0" encoding="utf-8"?> <RelativeLa ...

  4. Net 自定义Excel模板导出数据

    转载自:http://www.cnblogs.com/jbps/p/3549671.html?utm_source=tuicool&utm_medium=referral 1 using Sy ...

  5. HRBUST 1909 理工门外的树(双数组实现线段树功能)

    线段树固然可以做,但是在考虑线段树之前应该先考虑一下,这种用两个数组来解决问题的方法能不能行,如果行的话,就会为我们省很多时间,毕竟线段树代码量比较大 #include<iostream> ...

  6. 转:XPath路径表达式

    XPath 使用路径表达式来选取 XML 文档中的节点或节点集.节点是通过沿着路径 (path) 或者步 (steps) 来选取的. XML 实例文档 我们将在下面的例子中使用这个 XML 文档. & ...

  7. docker rancher 体验 (未完待续.....)

    docker rancher 体验 官方 githubhttps://github.com/rancher/rancher 环境说明: 10.6.0.14010.6.0.18710.6.0.188 修 ...

  8. scrollView顶部空白

    在iOS7之后,苹果会自动给导航控制器里面的所有UIScrollView顶部都会添加额外的滚动区域64.

  9. CodeForces 590A Median Smoothing

    构造题. 答案可以o(n)构造出来.首先要发现规律.只有01交替的串才可能变化,变化规律如下: 1开头,长度为偶数(0结尾):变(len-2)/2次 变完后 前半1 后半01开头,长度为奇数(1结尾) ...

  10. 解决IE6中PNG图出现灰色背景问题

    第 1 种方法:定义一个样式,给某个div应用这个样式后,div的透明png背景图片自动透明了.(注意两处图片的路径写法不一样,本例中,icon_home.png图片与html文件在相同目录) < ...