Service是一个android的四大组件之一,它没有UI界面,可以在后台执行长时间的操作。其他的组件可以start一个Service,service启动以后会在后台持续运行,不管用户是否切换到了其他的应用程序。此外,其他的组件还可以绑定到service上,并和service做交互,甚至还可以执行跨进程的操作(IPC)。比如说,Service可以在后台处理网络请求、播放音乐,执行文件i/o或者跟content provider交互。
Service
定义:后台运行,不可见,没有界面,优先级高于activity
用途:播放音乐,记录地理信息位置的改变,监听某种动作
注意:运行在主线程,不能用它来做耗时的请求或动作
一般service不会被系统干掉,就算被干掉了也会自启
注意:
运行在主线程,不能用它来做耗时的操作。可以在service中开辟一个线程来做耗时操作(handler,synctask)
分类
本地服务(Log Service)应用于:
1、应用程序内部
2、startService stopService stopSelf
远程服务应用于:
1、Android系统内部的应用程序之间
2、定义IBinder接口
数据的操作都要通过定义IBinder接口来实现
Service的生命周期
Service的启动和生命周期
1. 左边是通过startService()开启service,右边是通过bindService()
2. 左边
(1)onStartCommand()之后service就会运行,可以通过启动源调用stopService()来停止service
(2)stopService的调用会调用onDestroy()
3. 右边
(1)bindService()会自动调用onCreate()
(2)可以通过unbindService()来unbind这个service,然后onUnbind()会自动被调用
Service两种启动方式的特点:
start方式的特点:
(1)服务跟启动源没有任何的联系
(2)无法获得服务对象
Bind方式的特点:
(1)通过IBinder接口实例,返回一个ServiceConnection对象的启动源
(2)通过ServiceConnection对象的相关的方法可以得到Service对象
有两种形式的service:
Started
当其他的组件通过调用startService()启动的service是“Started”。一旦启动以后,service就在后台无限的运行下去,就算是启动他的组件已经被销毁了。通常来说,Started service只会做单一的操作,并且不会返回给调用者返回值。比如:它可以通过网络下载或者是上传文件。当操作结束的时候,service要手动把自己停止掉。
Bound
当其他组件通过调用bindService()绑定到service的时候,service就是 "bound"的。bound service提供了客户端/服务端的接口,允许组件和service进行交互,发送请求,获取结果,甚至是做跨进程的操作。bound service只存活于其他组件绑定在它上面的时候,多个组件可以同时绑定到一个service,但是,当所有的组件同时解绑以后,service就被销毁了。
尽管本文档是分开讨论这两种类型的service的,但是你的service可以同时支持这两种类型,service可以是started(无限运行)同时还允许绑定。这仅仅取决于你是否实现了下面的回调:onStartCommand()允许其他的组件start一个service,onBind()允许绑定service。
不管你的service是started还是bound,应用的其他组件都可以使用这个service(甚至是别的应用)。就如同别的组件都可以使用一个Activity一样,通过Intent来启动它。但是,你也可以在manifest文件中把service声明成应用私有的,这就阻止了别的应用访问它。
服务的两种启动方式:
1.通过startService(Intent intent)启动,stopService(Intent intent)停止,比较简单。服务启动后与启动源无关,也无返回服务本身。需注意要在配置文件中注册服务。
2.通过bindService(Intent intent,ServiceConnection conn,int flags)绑定服务启动,unbindService(ServiceConnection conn)去绑定停止,该方式可以返回服务本身,与启动源相关。
具体步骤:
Intent intent = new Intent(上下文, 目标服务名.class);
bindService(intent, conn, Service.BIND_AUTO_CREATE);//绑定
2)在自定义的服务类中通过自定义一个内部类:
public class MyBinder extends Binder {
public MyBindService getService() {
return MyBindService.this;// 获取服务
}
}//来返回服务本身
//同时在自定义服务类重新父类Service的方法:
public IBinder onBind(Intent intent) {
return new MyBinder();
}
//该方法可返回服务本身.
//初始化ServiceConnection接口,在接口方法中重写方法
public void onServiceConnected(ComponentName name, IBinder service) {
myBindService = ((MyBinder)service).getService();//大类转化为自身的小类,获取内部类中的方法,从而获得服务本身
}
4)在自定义的继承于Servic类的类中,添加需要的方法,在启动Service的Activity中可以直接调用服务中的方法。
好了,希望能帮到大家~~