iis服务器助手广告广告
返回顶部
首页 > 资讯 > 移动开发 >Android Service生命周期详解
  • 756
分享到

Android Service生命周期详解

androidserviceserviceservice生命周期Android 2022-06-06 09:06:25 756人浏览 泡泡鱼
摘要

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

引言

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

可以发现第一次startService时,会调用onCreate和onStart,在没有stopService前,无论点击多少次 startService,都只会调用onStart。而stopService时调用onDestroy。再次点击stopService,会发现不会 进入service的生命周期的,即不会再调用onCreate,onStart和onDestroy。

而onBind在startService/stopService中没有调用。

需要注意一个问题,当Activity退出的时候,Sercvice并不会停止,此时我们可以再进入Activity重新绑定,当这时候Service 就会调用onRebind()方法,但是调用onRebind()方法的前提是先前的onUnbind()方法执行成功,但是使用 super.onUnbind(intent)是执行不成功的,这时候我们要手动的使其返回true,再次绑定时Rebind()就会执行。否则,如果退 出时不显示的指定onUnbind()为成功的话(为false),那么重新启动此Activity来绑定服务时,Service的onBind()方法 和onReBind都不会执行,但是ServiceConnection方法确一定会回调了。这说明在Service中的onBind()方法不同于 onStart()方法不能被重复调用。

2、广播接收者生命周期

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

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

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

ps:Service 类两种启动方法:

• Context.startService()
• Context.bindService()

1.  在同一个应用任何地方调用 startService() 方法就能启动 Service 了,然后系统会回调 Service 类的 onCreate() 以及 onStart() 方法。这样启动的 Service 会一直运行在后台,直到 Context.stopService() 或者 selfStop() 方法被调用。
另外如果一个 Service 已经被启动,其他代码再试图调用 startService() 方法,是不会执行 onCreate() 的,但会重新执行一次 onStart() 。

2. 另外一种 bindService() 方法的意思是,把这个 Service 和调用 Service 的客户类绑起来,如果调用这个客户类被销毁,Service 也会被销毁。用这个方法的一个好处是,bindService() 方法执行后 Service 会回调上边提到的 onBind() 方发,你可以从这里返回一个实现了 IBind 接口的类,在客户端操作这个类就能和这个服务通信了,比如得到 Service 运行的状态或其他操作。如果 Service 还没有运行,使用这个方法启动 Service 就会 onCreate() 方法而不会调用 onStart()。

总结

1. startService()的目的是回调onStart()方法,onCreate() 方法是在Service不存在的时候调用的,如果Service存在(例如之前调用了bindService,那么Service的onCreate方法已经调用了)那么startService()将跳过onCreate() 方法。

2.  bindService()目的是回调onBind()方法,它的作用是在Service和调用者之间建立一个桥梁,并不负责更多的工作(例如一个Service需要连接服务器的操作),一般使用bindService来绑定到一个现有的Service(即通过StartService启动的服务)。

由于Service 的onStart()方法只有在startService()启动Service的情况下才调用,故使用onStart()的时候要注意这点。

您可能感兴趣的文章:Android实现Activity、Service与Broadcaster三大组件之间互相调用的方法详解Android Service自启动注意事项分析Android中使用Service实现后台发送邮件功能实例Android实现从activity中停止Service的方法Android编程实现开始及停止service的方法Android getSystemService用法实例总结Android中Service服务详解(二)Android中Service服务详解(一)详解Android中IntentService的使用方法详解Android中Service服务的基础知识及编写方法


--结束END--

本文标题: Android Service生命周期详解

本文链接: https://www.lsjlt.com/news/26364.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Android Service生命周期详解
    引言 应用程序组件有一个生命周期——一开始Android实例化他们响应意图,直到结束实例被销毁。在这期间,他们有时候处于激活状态,有时候处于非激活状 态;对于活动,对用户有时...
    99+
    2022-06-06
    android service service service生命周期 Android
  • Android Service类与生命周期详细介绍
    Android  Service类与生命周期 Service是Android四大组件与Activity最相似的组件,都代表可执行的程序,区别在于Service一直在后...
    99+
    2022-06-06
    service Android
  • 《Android》Activity生命周期详解
    1、什么是Activity的生命周期? 用户在使用一个应用程序时,随着应用的启动、页面的跳转、进入后台等一些操作的发生,Activity会回调一...
    99+
    2022-06-06
    activity生命周期 activity Android
  • Android Activity生命周期详解
    Activity 的生命周期。 一、理解Activity Activity是Android程序的4大组件之一。 Activity是Android程序的表示层。程序的每一个显...
    99+
    2022-06-06
    activity生命周期 activity Android
  • Android bindService的使用与Service生命周期案例详解
    Android中有两种主要方式使用Service,通过调用Context的startService方法或调用Context的bindService方法,本文只探讨纯bindServi...
    99+
    2022-11-12
  • Android startService的使用与Service生命周期案例详解
    Android中有两种主要方式使用Service,通过调用Context的startService方法或调用Context的bindService方法,本文只探讨纯startServ...
    99+
    2022-11-12
  • 基于Android Service 生命周期的详细介绍
    Service概念及用途: Android中的服务,它与Activity不同,它是不能与用户交互的,不能自己启动的,运行在后台的程序,如果我们退出应用时,Service进程并没...
    99+
    2022-06-06
    android service service Android
  • Android Fragment的生命周期详解
    Fragments的生命周期        每一个fragments 都有自己的一套生命周期回调方法和处理自己的用...
    99+
    2022-06-06
    android fragment fragment Android
  • Android  Service类与生命周期详细介绍
    Android  Service类与生命周期Service是Android四大组件与Activity最相似的组件,都代表可执行的程序,区别在于Service一直在后台运行且没有用户界面。Service的类图和生命周期先来看看Ser...
    99+
    2023-05-31
    android service bs
  • Android开发Activity的生命周期详解
    目录前言典型情况下的生命周期分析前言 Android生命周期分为两部分:  (1)典型情况下的生命周期。(2)异常情况下的生命周期。 典型情况下的生命周期分析 图1 Ac...
    99+
    2022-11-13
  • Vue生命周期详解
    这篇博客将会从下面四个常见的应用诠释组件的生命周期,以及各个生命周期应该干什么事 单组件的生命周期父子组件的生命周期兄弟组件的生命周期宏mixin的生命周期 生命周期:Vue 实例从...
    99+
    2022-11-13
  • rust生命周期详解
    目录rust生命周期借用检查函数中的生命周期手动声明生命周期结构体中的生命周期生命周期消除三条消除原则生命周期约束静态生命周期rust生命周期 生命周期是rust中用来规定引用的有效...
    99+
    2023-03-19
    rust生命周期
  • 详解vue生命周期
    目录为什么要理解生命周期什么是生命周期生命周期钩子函数created和mounted钩子的一些实战用法1.异步函数 2.Vue.nextTick对异步函数的结果进行操作 总结为什么要...
    99+
    2022-11-12
  • Android开发之activity的生命周期详解
    本文实例讲述了Android activity的生命周期。分享给大家供大家参考,具体如下: activity类处于android.app包中,继承体系如下: 1.Java.la...
    99+
    2022-06-06
    activity android开发 Android
  • React的生命周期详解
    一、React生命周期 React 生命周期分为三种状态 1. 初始化2.更新3.销毁 初始化 1、getDefaultProps() 设置默认的props,也可以用dufault...
    99+
    2022-11-13
  • 详解uniapp的生命周期
    Uniapp作为一款跨平台应用开发框架,具有丰富的生命周期,以下是Uniapp的生命周期: 1.应用生命周期 应用生命周期是指应用程序从启动到关闭的整个过程,包括应用程序的启动、前后...
    99+
    2023-05-17
    vue uniapp uniapp生命周期
  • 微信APP生命周期及页面生命周期示例详解
    目录官方文档小程序的启动流程app生命周期页面的生命周期页面的生命周期(图)官方文档 ogram&jumpbackUrl=%2Fdoc%2F" rel="external n...
    99+
    2022-11-13
  • Android Activity横竖屏切换生命周期详解
    关于Activity生命周期和横竖屏切换时,生命周期的执行过程,网上有很多文章。但是都写的很模糊,并且不完善。一般的我们去切换屏幕方向都是不希望...
    99+
    2022-06-06
    activity Android
  • Vue生命周期区别详解
    生命周期分类 vue每个组件都是独立的,每个组件都有一个属于它的生命周期, 从一个组件创建、数据初始化、挂载、更新、销毁,这就是一个组件所谓的生命周期。 在组件中具体的方法有: ...
    99+
    2022-11-12
  • React中的生命周期详解
    目录react生命周期常用的生命周期不常用的生命周完整的生命周期图react生命周期 函数组件无生命周期,生命周期只有类组件才拥有 生命周期函数指在某一时刻组件会自动调用并执行的函数...
    99+
    2022-11-13
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作