Android开发之组件生命周期(二)

系统 1649 0

引言

应用程序组件有一个生命周期——一开始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() 调用。

service_lifecycle

2、广播接收者生命周期

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

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

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

Android开发之组件生命周期(二)


更多文章、技术交流、商务合作、联系博主

微信扫码或搜索:z360901061

微信扫一扫加我为好友

QQ号联系: 360901061

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描下面二维码支持博主2元、5元、10元、20元等您想捐的金额吧,狠狠点击下面给点支持吧,站长非常感激您!手机微信长按不能支付解决办法:请将微信支付二维码保存到相册,切换到微信,然后点击微信右上角扫一扫功能,选择支付二维码完成支付。

【本文对您有帮助就好】

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描上面二维码支持博主2元、5元、10元、自定义金额等您想捐的金额吧,站长会非常 感谢您的哦!!!

发表我的评论
最新评论 总共0条评论