Service知识点总结
链接分享:https://www.open-open.com/lib/view/open1364094651062.html
Service:Android四大组件之一,通常不具有界面,用于运行后台程序
service不会自动创建线程,如果处理耗时的后台任务,需要创建线程使用,否则运行在主线程可能会出现ANR
创建service必须实现继承于service,并重载一些生命周期回调
Service启动方式
startService
一旦启动除非主动杀死service,否则会一直在后台运行,及时启动service的组件应用程序已经退出销毁。
通常通过此方法启动的service运行不会给启动的组件返回结果
只有调用自身的stopSelf()或者其他组件调用stopService()才会销毁,否则会一直运行
bindService
绑定的service可以进行和其他应用进行通讯,可以返回请求结果;或者进行IPC进程间通讯
绑定的service可以绑定多个组件,也可以同时启动、绑定service
绑定的service依赖绑定的组件应用程序,绑定的组件或应用程序全部退出后service会销毁
生命周期和绑定其组件的生命周期相同,只有绑定其组件销毁,service才会销毁
Service的生命周期
onCreate
创建Service实例时调用
在这里可以进行初始化一些参数
onDestroy
在service销毁之前调用
在这里可以释放一些资源
onStartCommand
采用startService()方法启动service会调用该回调,只调用一次
如果需要绑定service可以选择不重写该方法
有返回值,返回值决定了当系统杀死service的时候,service的启动方式:
1. START_STICKY :会使用空的intent重新创建service,并调用onStartCommand()方法,除非intent是一个pendingIntent。
适用于媒体播放器服务。
2. START_NOT_STICKY:不会重新创建service,除非传入的intent是一个pendingIntent。
3. START_REDELIVER_INTENT:会使用传入的intent重新创建service,并调用onStartCommand()方法。适用于一些活跃的工作服务,如下载文件等服务。
onBind
需要返回一个IBinder对象来支持客户端和服务端之间的通讯
Service必须重写的方法,如果采用startService()方式启动,则返回null即可
Service的使用方法
和其他四大组件相同,首先必须在AndroidManifest中定义声明Service
声明Service必须给出name属性即service的名称
可以声明IntentFilter供其他组件或者应用调用
如果希望service是私有的即只在本应用中使用将exported定义为false,并不声明任何IntentFilter即可。
startService
bindService
IntentService
由于Service默认在启动它的线程中启动,如果需要执行耗时操作需要自己创建线程来实现,此时可以选择IntentService来实现。
IntentService特点
使用IntentService时应该注意,只需要实现一个传入一个name的构造方法和onHandleIntent()即可,如果重写回调方法需要实现super来执行默认的逻辑
内部会创建一个工作线程来逐个处理耗时操作,无需关心多线程并发问题
在处理完所有的请求后,会自己调用stopSelf销毁自己,无需手动销毁
内部已经实现了Service的默认回调,如果不需要,无需重写onCreate()、onStartCommand()、onBind()、onDestroy()方法
onStartCommand()有默认实现,会处理传入的请求后传入onHandleIntent()