安卓核心组件二service
- 简介:服务是能够在后台长时间运行操作并且不提供用户界面的应用程序组件,例如,服务能在后台处理网络服务,播放音乐,执行文件IO或者与CotentService通信
- service的分类
- started(启动):启动服务启动后在后台无限期运行,即使启动服务的组件已经销毁;
- bound(绑定):绑定服务提供客户端-服务端接口,以允许组件与服务交互,发送请求,获得结果,甚至使用进程间通信(IPC)跨进程完成这些操作。多个组件可以依次绑定到一个服务上。当所有服务都解绑时,服务被销毁
- 注意:服务进程运行于管理它的主线程,所以为了避免ANR,要使用独立的线程
- Service:所有服务的基类,通过startservice启动,第一次启动会先调用oncreat方法,以后启动会调用onStartCommand方法,可以从这个方法中获取组件传递过来的数据。可以通过修改onBind方法的返回值设置粘性,可选的有:
- a) START_STICKY:粘性的
- b) START_NOT_STICKY:非粘性的
- c) START_STICKY_COMPATIBILITY:兼容模式下的粘性的
- d) START_REDELIVER_INTENT:粘性的,且在自动重新启动Service时会携带原来激活Service的Intent对象
- IntentService:IntentService完成如下任务
- 创建区别于应用程序主线程的默认工作线程来执行发送到onStartCommand方法的全部intent
- 创建工作队列别每次传递一个Intent到onhandlerintent方法实现,这样就不必担心多线程
- 所有启动请求任务处理完毕后停止服务,这样就不必调用stopSelf()方法
- 提供onbind方法默认实现,其返回值是null
- 提供onStartcommand方法的默认实现,它发送intent到工作队列然后到onhandler方法实现
- 绑定服务:绑定服务同样是使用Service类,不过要继承Ibinder类并且重写onbinder方法。实现步骤如下
- 在服务中,创建Binder类实例来完成下列操作之一:包含客户端能调用的公共方法;返回当前servicer实例,其中包含客户端能调用的公共方法;返回服务管理的其他类的实例,其中包含客户端能调用的公共方法;
- 从onbind回调方法中返回binder类实例
- 在客户端,从onserviceconnected回调方法接收binder类实例,并且使用提供的方法调用绑定服务。
- 服务的销毁和解绑:启动服务用由自己调用stopself或者其他组件调用stopservice方法停止,绑定服务由unbindservice(connection)来执行。
- 补充:bindService(intent,connection,value);
- intent对象只需要指定服务
- connection是ServiceConnection的实例,需要自定义onserviceconnection和onservicedisconnection,并且就是通过这个对象来调用相应的方法。
- value的值一般使用Context.BIND_AUTO_CREATE;
- 再补充一下继承IntentService时的构造方法问题:继承IntentService的时候要求添加带参数的构造方法,但是事实是构造方法里面是不能存在参数的,因为service是系统组件,所以要删去构造方法里面的参数,但是可以在构造方法里面直接使用常量作为参数