目录
3、onStartCommand(Intent intent, int flags, int startId)
一、Service生命周期
二、Service生命周期相关的方法
1、onCreate()
首次创建服务时由系统调用。不要直接调用这个方法。
2、onBind(Intent intent)
将通信通道返回给服务。如果客户端无法绑定到服务,则可能返回 null。返回 IBinder的通常是使用 aidl 描述的复杂接口。请注意,与其他应用程序组件不同,对此处返回的 IBinder 接口的调用可能不会发生在进程的主线程上。有关主线程的更多信息可以在进程和线程中找到 。
3、onStartCommand(Intent intent, int flags, int startId)
每次客户端通过调用显式启动服务时由系统调用 Context.startService(Intent),提供它提供的参数和表示启动请求的唯一整数标记。不要直接调用这个方法。
为了向后兼容,默认实现调用 onStart(Intent, int)并返回START_STICKY 或START_STICKY_COMPATIBILIT
注意:系统在您的服务的主线程上调用它。服务的主线程与在同一进程中运行的活动发生 UI 操作的线程相同。您应该始终避免停止主线程的事件循环。在进行长时间运行的操作、网络调用或大量磁盘 I/O 时,您应该启动一个新线程,或使用异步。
4、onRebind(Intent intent)
在新客户端连接到服务时调用,之前已通知它所有已在其 onUnbind(Intent). 仅当实现onUnbind(Intent)被覆盖以返回 true时才会调用此方法。
5、onUnbind(Intent intent)
当所有客户端与服务发布的特定接口断开连接时调用。默认实现不执行任何操作并返回 false。如果您希望稍后在新客户端绑定到它时调用该服务的方法,则返回 true 。
6、stopSelf()
停止该服务(如果它之前已启动)。这与调用Context.stopService(Intent)此关闭特定服务相同。
7、stopSelfResult(int startId)
如果最近一次启动服务,则停止服务 startId. 这与调用Context.stopService(Intent)此特定服务相同,但允许您安全地避免在来自客户端的启动请求时停止,而您尚未在onStart(Intent, int)
请注意对此函数的调用顺序。如果在为之前收到的 ID 调用此函数之前使用最近收到的 ID 调用此函数,则无论如何服务将立即停止。如果您最终可能会乱序处理 ID(例如通过在单独的线程上分派它们),那么按照接收它们的相同顺序停止服务。
8、onDestroy()
由系统调用以通知服务它不再使用并且正在被删除。服务此时应该清理它持有的所有资源(线程、注册的接收器等)。返回后,将不再调用此 Service 对象,它实际上已死。
三、直接启动服务
1、通过startService()启动服务的过程:
onCreate() > onStartCommand() > onStart()
startService() 仅用于启动服务不能绑定客户端。
2、多次调用startService(),服务会多次执行:
onStartCommand() > onStart()
3、多次调用startService()后,调用一次stopService()或者stopSelf(int)即可结束服务,多次调用stopService(),只有第一次有用。
注意:
一、如果是单一客户端(一般为activity),因为多次调用startService(),也只会产生一个service实例,所以调用一次stopService()或者stopSelf(int)(stopSelf(int) 的参数为 onStartcommand(Intent intent,int flages,int startId) 的 startId )即可结束服务。
二、如果是多个客户端调用startService()则需要全部客户端调用stopService(),直到最后一个客户端调用调用stopService()service才会调用onDestroy()。
4、调用stopService()的服务结束过程:
> onDestroy()
四、直接绑定服务
1、通过bindService()启动服务的过程:
onCreate() > onBind() > (onServiceConnected() )
bindService() 用于绑定服务,使Activity与Service进行通信。
注意:如果没有service实例,将创建实例并启动服务。
2、多次调用bindService(),服务本身不会执行任何调用。
注意:
一、系统会缓存 IBinder 服务通信通道。换言之,只有在第一个客户端绑定服务时,系统才会调用服务 onBind() 的方法来生成
IBinder。然后,系统会将该
IBinder传递至绑定到同一服务的所有其他客户端,无需再次调用
onBind()。所以可以通过继承
Binder通过方法获取不同的对象。
二、多个客户端调用bindService(),同样也需要多次调用unBindService(),直到service没有绑定才会调用unBindService()。
3、调用unBindService()的服务结束过程:
onUnbind () > onDestroy()
注意:如果服务已启动并接受绑定,那么当系统调用 onUnbind () 方法时,如果想在客户端下一次绑定到服务时接收 onRebind()调用,可以选择返回 true(默认系统返回false)
。onRebind() 返回空值,但客户端仍会在其 onServiceConnected() 回调中接收IBinder。下图说明了这种生命周期的逻辑。
五、先启动服务,后绑定服务
1、先调用startService(),后调用bindService()。服务的过程为:
onCreate() > onStartCommand() > onStart() > onBind() > (onServiceConnected() )
2、先unBindService(),后stopService()。服务结束的过程:
onUnbind() > onDestroy()
注意:unBindService()会执行到onUnbind(),stopService()会执行到onDestroy()。
3、先stopService(),后unBindService()。服务结束的过程:
onUnbind() > onDestroy()
注意:stopService()不会执行任何操作,unBindService()会执行到onUnbind() > onDestroy()。
六、先绑服务,后启动启服务
1、先调用startService(),后调用bindService()。服务的过程:
onCreate() > onBind() > (onServiceConnected() ) > onStartCommand() > onStart()
2、先unBindService(),后stopService()。
onUnbind() > onDestroy()
3、先stopService(),后unBindService()。服务结束的过程:
onUnbind() > onDestroy()
注意:先stopService()不会执行onDestroy()。后unBindService()才会onUnbind() > onDestroy()。所以有绑定须先解绑。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/128372.html