导图社区 安卓Service
这是一篇关于安卓Service简介的思维导图,主要内容有基本常用方法,以及其他常见系统Service等。
编辑于2021-09-02 08:12:36Service
简介
四大组件之一; service一直运行在后台; 和Activity一样,有自己的生命周期; 与用户交互使用Activity,反之就要考虑使用Service.
为什么要使用Service
相比于Activity,当前台关闭后,Activity中执行的任务要统统关闭。 所以,当前台关闭后,还能运行程序,那就是后台使用Service。
Service开发步骤
定义一个继承Service的子类
在AndroidManifest.xml中配置Service
在AndroidManifest.xml 中使用 <service andriod.name=".FirstService"> <Intent-filter> 过滤条件 <Intent-filter/> <service/> 来配置哪些Intent可以启动该Service。 ps: 与Activity的启动方式很像
启动Service
Service回调方法(生命周期)
onCreate()
Service第一次创建后,回调onCreate()方法
IBinder onBind(Intentintent)
当客户端以bindService()方法启动Service时候,回调onBind()方法。 该方法返回的IBinder对象,作为参数传递给ServiceConnection对象的onServiceConnected(ComponentName name, IBinder service)方法,在该方法内获取IBinder对象,即可实现客户端和Service组件的通信,传递数据。 ps: IBinder对象就是Service的代言人
onStartCommand(Intent intent,int flags,int startId)
客户端调用startService()方法启动Service,都会回调该方法。
boolean onUnbind(Intent Intent)
客户端调用unBindService()方法后,回调onUnBind()方法。
onDestroy()
在Service关闭之前将会调用该方法
两种启动Service方式
andriod 5.0之后,Google要求必须使用显示Intent来启动Service组件
Context.startService()
startService()启动Service后,启动方和Service之间没有任何关联。 1. 没有生命周期关联,即使启动方退出了,Service也依然运行。 2. 没有数据通信。 与之对应的关闭Service方法,是stopService()方法。
Context.bindService()
bindService()启动Service, 启动方和Service绑定在一起。 1. 生命周期关联,启动方退出,Service也就终止了 2. 启动方通过IBinder 对象和Service之间进行通信 与之对应的关闭Service方法是unBindService() ps: 启动方调用unBindService(),只是取消与Service的绑定,Service不会终止。
绑定Service并与之通信
bindService(Intent service, ServiceConnection conn, int flags)
Intent service
该参数通过Intent来指定要启动的Service
ServiceConnecton conn
该参数是一个ServiceConnection对象,用于监听访问者与Service的连接情况。
onServiceConnected(ComponentName name, IBinder service)
访问者与Service连接成功后,回调ServiceConnection对象的onServiceConnected()方法。
onServiceDisconnected(ComponentName name)
当Service所在宿主进程由于异常终止或其他原因终止,导致Service与访问者之间断开连接,回调ServiceConnection对象的onServiceDisconnected()方法。 ps: 上面是异常断开,而不是调用onUnBind()方法断开连接。
int flags
指定绑定时,是否自动创建Service. 0: 不自动创建 BIND_AUTO_CREATE: 自动创建
与Service通信步骤
创建Service
Service中重写onBind()方法,返回IBinder对象
访问者中创建ServiceConnection对象,并重写onServiceConnected()方法
访问者通过bindService()启动Service
调用流程说明
访问者调用bindService()方法启动Service, 会回调'Service的onBind()方法,当访问者和Service连接成功后,会回调ServiceConnection对象的onServiceConnected(ComponentName name, IBinder service)方法. onServiceConnected()方法中参数 IBinder 对象是由Service的onBind()方法的返回值传递进来的。
IntentService
IntentService是Service的子类,它比普通的Service增加了一些额外功能
Service存在的两大问题
Service不会专门启动一个单独的进程,Service与它所在的应用位于同一个进程
Service不是一个新的线程,因此不应该在Service中之间处理耗时任务
可以在Service中启动一个子线程来做耗时操作,从而不阻塞UI线程
IntentService五大特征
IntentService会创建单独的Worker线程来处理所有Intent请求
IntentService创建单独的Worker线程来处理onHandleIntent()方法实现的代码,开发者无须处理多线程问题
当所有请求处理完成后,IntentService会自动停止,开发者无须调用停止方法。
为Service的onBind()提供默认实现,返回null
为Service的onStartCommand()提供默认实现,该实现会将请求的Intent添加到队列中
IntentService的回调方法
onHandleIntent()
IntentService会创建单独的Worker线程来处理该方法,所以该方法运行在子线程,执行耗时操作不会阻塞UI线程
其他与普通Service一样
IntentService工作流程
IntentService将会使用队列来管理请求的Intent, 当客户端通过Intent启动IntentService时候,IntentService会将Intent加入的队列中,然后开启一条新的worker线程来处理该Intent。对于异步的StartService()请求,Intent会依次从处理队列中的Intent,该worker线程保证同一时刻只处理一个Intent。所以开发者无须处理多线程问题。
疑问
onBind()返回Null,那如何实现访问者与IntentService之间的通信
疑问
1. 普通Service如何处理多个StartService()请求 2. 普通Service执行任务,是不是在任意的回调方法中都可以执行,还是必须在onStartCommand()方法中执行