有两种方式 绑定方式和直接开启的方式
绑定的方式使用bindService()绑定服务 可以得到服务的代理人对象,间接调用服务里面的方法。如果activity被销毁服务也会随之销毁。stopService()对于绑定方式没有用
直接开启的方式采用startService(),这种方式开启服务不会随着activity销毁但是不能操作服务里面的方法,这种方式对应有个关闭服务的方法stopService()。
绑定本地服务和绑定远程服务有一点不同:绑定本地的服务可以直接在Intent的初始化时显示的初始化而远程服务的绑定就不能显示需要隐式以前的隐式是Intent intent=new Intent(); intent.setAction("xxx.xxx");这不能用在5.0的平台可以换成Intent intent=new Intent("action name of service "); intent.setPackage("package name of service");
远程绑定是在包下面写一个接口文件后缀改为.aidl这会自动在gen文件夹下自动生成对应的接口.java文件
第三方使用远程的服务需要将接口文件.aidl连同包名复制到自己的源文件目录下
public void onServiceConnected(ComponentName name, IBinder service) {
mybinder=IService.Stub.asInterface(service);//获得接口实例的方式 跟绑定本地服务的强制转换不同
}
生命周期:开启的startService的是oncreate()->onstartCommand()->ondestroy()
绑定的bindService的是oncreate()->onBind() onUnbind()->ondestroyy() 服务只能被绑定一次 多次解除绑定会报错
混合调用 例如既要保证服务长期在后台运行,又想去调用服务里面 的方法
1先开启服务2再绑定服务
1.开启服务 startService() oncreate()
2.绑定服务 bindService() onBind()
3.关闭程序 调用者退出 服务解绑
4.stopService()停止服务
对于绑定服务操作服务里面的方法不是直接new 服务类的实例 这样做只是一个空的服务我们需要使用绑定后返回的IBinder的子类对象 IBinder是一个接口里面的方法很多我们不是直接去实现他而是继承他的直接子类Binder activity中使用bindService(Intent service, ServiceConnection conn,int flags)去绑定服务其中的各个参数的含义第一个是传递Intent对象他存储了需要指向的服务,第二个ServiceConnection是一个系统回调接口,我们需要去写一个子类实现他 会要实现两个函数onServiceConnected(ComponentName name,IBinder service)和onServiceConnected(ComponentName name, IBinder service)这两个函数都是系统回调函数其中的IBinder参数就是从服务传过来的,我们可以通过这获取IBinder的对象然后调用服务里面的方法,其中这个调用方法其实是间接的调用服务的方法是在IBinder的子类中又写了一个函数去调用服务的方法,还有如果我们不想直接获得IBinder的对象可以写一个接口里面写一个调用方法让IBinder的子类去实现他,这样我们就能在activity中去获得这个接口的引用,通过这个引用去使用调用方法,这是接口回调的方式很好的保护了一个类防止暴露类里面其他的方法。