《第一行代码》Service学习笔记

本文详细探讨了Android Service的使用,包括stopself()的运用、启动服务与绑定服务的区别、绑定服务的实现方式、onBind、onUnbind、onRebind的调用逻辑以及服务的线程和进程管理。此外,还讨论了如何处理服务的多个请求,启动服务如何通过广播返回结果,以及服务与通知栏的交互。
摘要由CSDN通过智能技术生成

1、stopself()如何使用?


服务的线程问题:

服务不会主动开启子线程,默认在主线程中运行
问:应用结束后,服务会被销毁吗


2、启动与绑定的区别
通过startService()启动的服务,启动后与启动它的组件无关,直至用stopSelf()或stopService()停止。
组件通过bindService()绑定服务,当所有与服务绑定的组件解除绑定后,服务会被销毁。
startService()可以多次调用onStartCommand()方法;
bindService()在绑定期间只能调用一次onServiceConnnection()方法。


3、绑定服务初探

只有 Activity、服务(也可以吗?)、内容提供程序可以绑定到服务 ,无法从广播接收器绑定到服务,但广播可以用startService()启动服务。
绑定方式一:扩展Binder类
使用范围:服务供自有应用专用,并且在与客户端相同的进程中运行。
优点:直接使用 Binder中的实现乃至 Service 中可用的公共方法(在实现中返回Service的实例)。
绑定过程:
实现ServiceConnection接口
调用bindService()方法(传入ServiceConnection实例)
调用Service的onBind()方法(接收intent,返回IBinder接口对象)
调用onServiceConnecetion()方法(接收IBinder对象)
解除绑定
法一:直接销毁与服务绑定的组件
法二:与服务绑定的组件调用unBindService()方法
当所有与服务绑定的组件解除绑定后,服务会被销毁


4、onBind、onUnbind、onRebind调用问题

google官方图片

上面是一张Google 官方图片,但验证上图时,当onUnbind()返回false时,与上图不符。onBind()与onUnbind()无法在onUnbind()调用后再次调用。当onUnbind()返回为true时,与上图一致,即所有绑定都解除后,若服务任然存在,再一次绑定,会调用onRebind()方法( 之后的绑定不会再调用),再次全部解绑后,会调用onUnbind()方法,只要服务存在,就能一直重复上述过程。

网上有一个总结:
  如果onUnbind方法返回false,则调用bindService的时候onBind不再执行,而且调用unbindService的时候,onUnbind也不会执行。
  如果onUnbind方法返回true,再次调用bindService的时候会执行onRebind,再调用unbindService的时候,onUnbind也会执行。
  
可能的解释:
Google官方文档:多个客户端可同时绑定到同一个服务。不过,只有在第一个客户端绑定时,系统才会调用服务的 onBind() 方法来检索 IBinder。系统随后无需再次调用 onBind(),便可将同一 IBinder 传递至任何其他绑定的客户端。

这段话可以理解为在Service的整个生命周期内(从创建到销毁),只会调用一次onBind()方法。第二、三······个客户端在调用bindService()后,不调用onBind(),直接调用onServiceConnnection()。而某个组件与服务绑定期间再次调用bindService()没有反映,即不能再次调用onServiceConnnection()。但在onUnbind()返回为false时,第一次调用后,再次调用bindService(),onBind()没有调用,但onServiceConnnection()却调用了,说明组件与服务再次进行了绑定。将组件与服务解绑,onUnbind()没有调用,这是否能说明onUnbind()要与onBind()(或onRebind)成对出现。

onRebind调用问题:当所有与服务的绑定解除后,若此时服务还存在,第一次建立新的绑定时,会调用onRebind,并且可以不断重复上述过程。


5、线程与进程


6、依次处理与同时处理


7、停止多请求服务


8、启动式服务如何用广播返回结果


9、前台与通知栏


10、其它

onServiceDisconnected()是干什么用的:
Android 系统会在与服务的连接意外中断时(例如当服务崩溃或被终止时)调用该方法。当客户端取消绑定时,系统“不会”调用该方法。

如果bindService()没有绑定成功:
If you have successfully bound to the service, true is returned; false is returned if the connection is not made so you will not receive the service object. However, you should still call unbindService(ServiceConnection) to release the connection.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值