Android Service生命周期 Android Service生命周期详解

软件发布|下载排行|最新软件

当前位置:首页IT学院IT技术

Android Service生命周期 Android Service生命周期详解

chongyucaiyan   2021-09-08 我要评论
想了解Android Service生命周期详解的相关内容吗,chongyucaiyan在本文为您仔细讲解Android Service生命周期的相关知识和一些Code实例,欢迎阅读和指正,我们先划重点:Android,Service,Android,Service生命周期,下面大家一起来学习吧。

前言

Service是Android系统的四大组件之一。在Android系统中,Service可以用来执行一些需要在后台长期运行的任务,也可以用来为其它应用提供一些服务。Service的使用方式主要有两种:startService()和bindService()。这两种方式下Service的生命周期不大相同。通过熟悉Service的生命周期,我们可以更加深刻地理解Android系统中Service的工作机制。

基础知识

一个Service不是一个单独的进程。Service本身不是运行在一个单独的进程中,除非在AndroidManifest.xml文件中指定了android:process属性。默认情况下,Service运行在应用所在的那个进程中。一个Service也不是一个线程。Service运行在应用的主线程中,所以如果要执行耗时的后台任务那么需要在子线程之中执行。

Service的生命周期

根据使用方式的不同,Service的生命周期可以分成2条路径,具体可以看下面这张引用自Android官网的图:

Service的生命周期.png

下面详细分析一下这些回调方法。

  • onCreate() 当Service被创建时回调。如果Service已经在运行,那么不会回调onCreate()方法。在onCreate()方法中,我们可以做一些初始化操作。
  • onStartCommand() 当有组件调用startService()方法启动Service时回调。在onStartCommand()方法中,我们可以执行后台任务。由于Service是运行在主线程之中的,所以如果是耗时的任务那么需要使用子线程来执行任务。在Service完成任务之后,需要有组件调用stopService()方法来停止Service,或者由Service调用stopSelf()方法来自行停止。
  • onBind() 当有组件调用bindService()方法与Service绑定时回调。在onBind()方法中,你可以通过返回一个IBinder对象来提供一个接口供客户端与Service进行通信。
  • onUnbind() 当客户端调用unbindService()方法与Service解除绑定时回调。
  • onDestroy() 当Service停止运行将被销毁时回调。当有组件调用startService()方法来启动Service时,Service开始运行。直到有组件调用stopService()方法来停止Service,或者由Service调用stopSelf()方法来自行停止。当有组件调用bindService()方法与Service绑定时,Service开始运行。直到所有的客户端与Service解绑时,Service停止运行。在onDestroy()方法中,我们应该释放所有的资源,比如子线程、注册的监听器和广播接收器等。

总结

根据使用方式的不同,Service的生命周期可以分成2条路径:

  • 启动Service Service在有组件调用startService()方法时创建,然后一直运行下去。组件可以通过调用stopService()方法来停止Service,或者Service调用stopSelf()方法来自行停止。Service停止之后,系统会将其销毁。
  • 绑定Service Service在有组件调用bindService()方法时创建。然后客户端可以通过IBinder接口与Service进行通信。客户端可以通过调用unbindService()方法来解除绑定。多个客户端可以绑定到同一个Service,当所有的客户端与Service解绑时,系统会销毁该Service。

注意:Service可以同时以这两种方式运行,也就是说,调用startService()方法启动Service的同时可以调用bindService()方法绑定Service。这种情况下,只有当所有客户端都解除绑定,并且有组件调用stopService()方法或者Service调用stopSelf()方法才可以停止Service。

我们可以总结出Service的2个生命期:

  • 完整生命期 从onCreate()方法回调开始,直到onDestroy()方法回调结束。与Activity类似,Service也在onCreate()方法中完成初始化工作,并在onDestroy()方法中释放所有资源。
  • 活动生命期 从onStartCommand()或者onBind()方法回调开始。对于启动Service,活动生命期与完整生命期同时结束。对于绑定Service,活动生命期在onUnbind()方法回调时结束。

例子

这里举一个例子来实践Service的生命周期。例子代码地址:https://github.com/chongyucaiyan/ServiceDemo

demo页面如下图所示:

demo页面.png

四个按钮分别用来启动Service,停止Service,绑定Service和解绑Service。

首先,我们实践下启动Service的生命周期。点击Start Service按钮启动Service。使用LocalService关键字过滤,打印的日志如下图所示:

启动Service的日志.png

可以看到Service依次回调了onCreate()和onStartCommand()方法,并且两个方法都是在主线程之中执行的。接着再点击两次Start Service按钮,打印的日志如下图所示:

多次启动Service的日志.png

可以看到Service运行之后,再次启动Service不会再回调onCreate()方法,只会回调onStartCommand()方法。最后点击Stop Service按钮停止Service,打印的日志如下图所示:

停止Service的日志.png

可以看到停止Service后,Service回调了onDestroy()方法。

然后,我们实践下绑定Service的生命周期。点击Bind Service按钮绑定Service。打印的日志如下图所示:

绑定Service的日志.png

可以看到Service依次回调了onCreate()和onBind()方法。接着再点击两次Bind Service按钮,可以看到Service不再回调onBind()方法,因为同一个组件同一时间只能绑定一次。最后单击Unbind Service按钮解绑Service,打印的日志如下图所示:

解绑Service的日志.png

可以看到Service依次回调了onUnbind()和onDestroy()方法。

最后,我们实践下同时以两种方式操作Service的生命周期。点击Start Service按钮启动Service,点击Bind Service按钮绑定Service,打印的日志如下图所示:

启动并绑定Service的日志.png

可以看到启动Service回调了onStartCommand()方法,绑定Service回调了onBind()方法,Service正常运行。这种情况下,只有客户端解除绑定,并且组件调用stopService()方法,才可以停止Service。依次点击Unbind Service和Stop Service按钮,打印的日志如下图所示:

停止启动并绑定的Service的日志.png

可以看到只有上述两种操作都执行完毕之后,Service才回调了onDestroy()方法。

参考

Copyright 2022 版权所有 软件发布 访问手机版

声明:所有软件和文章来自软件开发商或者作者 如有异议 请与本站联系 联系我们