Android学习之路-Service

2018-01-20  本文已影响0人  star小子
google官方对Service的两种启动方式的图解

一.什么是Service


Service 官方版介绍

请容我蹩脚的英语来稍微解释一下下哈:
Service是一个可以在后台执行长时间运行操作而不提供用户界面的应用组件。服务可由其他应用组件启动,而且即使用户切换到其他应用,服务仍将在后台继续运行。 此外,组件可以绑定到服务,以与之进行交互,甚至是执行进程间通信 (IPC)。 例如,服务可以处理网络事务、播放音乐,执行文件 I/O 或与内容提供程序交互,而所有这一切均可在后台进行。

二.Service(服务)的种类
Started:其他组件通过Context调用startService()方法启动一个Service。一旦启动,Service将一直运行在后台。即使启动Service的组件已被destroy掉了。通常,在进行App的进程保活时会采用该方法,在Activity等组件的onDestroy方法中发送一个广播通知保活Service启动。一个被start的Service会在后台执行单独的操作,也并不给启动它的组件返回结果,所以这点应该是常驻型Service的小缺憾吧。还有该类型Service由于常驻的特点所以在完成相关服务操作之后,比如一个start的Service执行在后台下载或上传一个文件的操作,完成之后,应该手动去停止Service,以防止资源浪费。

Bound:其他组件调用bindService()方法绑定一个Service。通过绑定方式启动的Service是一个类似CS的结构模式,该Service可以与绑定它的组件进行交互。一个bound service仅在有组件与其绑定时才会运行,相比与Start类型Service会显得更加灵活。多个组件可与一个service绑定,一旦该服务与所有客户端之间的绑定全部取消,系统便会销毁它。

Tips:无论是startService() 还是 bindService()启动Service,onCreate() 和 onDestroy()均会被回调。
start类型服务只有第一次启动时会回调onCreate()->onStartCommand()。以后再次开启该服务时只会执行onStartCommand()。

三.创建服务
我们都是知道顶级Service是一个abstract class。故我们可以继承Service然后开始搞事情😄。一般继承了Service之后编辑器会提示我们必须实现一个IBinder类型的onBind(Intent)方法。一般的服务并不需要回调该方法,一般直接返回null即可。但是如果想要通过Activity去操控和管理Service时就必须要有返回值才能在Activity声明的ServiceConnection onServiceConnected(ComponentName name, IBinder service) {

} 方法中去通过回调的IBinder进行相关操作。

四.注册服务


AndroidManifest.xml中注册服务

android:exported属性设为false,表示不允许其他应用程序启动本应用的组件,即便是显式Intent也不行(even when using an explicit intent)。这可以防止其他应用程序启动您的service组件。

五.启动服务


启动服务

startService(intent)方法将立即返回,并回调onStartCommand()(请不要手动调用该方法)

六.停止服务
一个被启动的Service必须管理自己的生命周期。系统不会主动stop或destroy一个运行的Service,除非系统内存紧张,否则,执行完onStartCommand()方法后,Service依然运行。停止Service必须手动调用stopSelf()(在Service中)或调用stopService()(在其他组件中)。同时必须明白无论调用多少次startService()或者bindService()系统默认只会持有一个全局的Service实例,所以如果要停止StopService或是启动StartService调用一次就够了哈。

七.IntentService
Service中的代码都是默认运行在主线程(UI线程)当中的,如果直接在服务里去处理一些耗时的逻辑,就很容易出现 ANR(Application NotResponding)的情况。所以这个时候就需要用到 Android多线程编程的技术了,我们应该在服务的每个具体的方法里开启一个子线程,然后在这里去处理那些耗时的逻辑。但是总会有一些程序员忘记开启线程, 或者忘记调用 stopSelf()方法。所以Google就为我们广大程序员提供了IntentService类来解决我们前面提到的两点尴尬。
使用方式便是自定义一个Service去继承IntentService类,然后实现onHandleIntent()方法,并将一些复杂了逻辑操作都放在该方法中执行吧,应该该方法是运行在子线程的哦,可以避免UI主线程卡顿的发生。

关于基本的Service今天先总结这么多,继续努力每天学好Android哈。

上一篇 下一篇

猜你喜欢

热点阅读