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

来源:互联网 发布:软件下载引导页源码 编辑:程序博客网 时间:2024/06/03 18:57

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.

原创粉丝点击