- 一、同应用启动 Service
- 二、跨应用启动 Service
- 三、跨应用绑定 Service
- 四、AIDL 的通信流程
- 五、startService()和bindService()区别
startService(new Intent(this,AppService.class));
二、跨应用启动 Service
Intent serviceIntent = new Intent();
serviceIntent.setComponent(new omponentName("com.example.test", "com.example.test.BookManagerService"));
startService(serviceIntent);
ComponentName 的两个参数:第一个参数是另外一个应用的包名,第二个参数是另外一个应用的Service 所在的位置
还有,被启动的Service需要在所在的项目的AndroidManifest.xml中声明Service权限,exporter的属性为true,否则不能跨应用启动
三、跨应用绑定 Serviceprivate ServiceConnection connection = new ServiceConnection() {
@Override
public void onServiceConnected(ComponentName componentName, IBinder iBinder) {
System.out.println("----服务已绑定");
IBookManager iBookManager = IBookManager.Stub.asInterface(iBinder);
try {
List list = iBookManager.getBookList();
Log.i("书的信息:", list.toString());
} catch (RemoteException e) {
e.printStackTrace();
}
}
@Override
public void onServiceDisconnected(ComponentName componentName) {
System.out.println("service disconnected");
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
btn_01 = findViewById(R.id.btn_01);
System.out.println("__________________client-------------------------");
btn_01.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Intent intent = new Intent();
intent.setComponent(new ComponentName("com.example.test", "com.example.test.BookManagerService"));
bindService(intent, connection, Context.BIND_AUTO_CREATE);
}
});
}
四、AIDL 的通信流程
一、服务端 1.服务端首先要创建一个 Service 用来监听客户端的连接请求 2.然后创建一个 AIDL 文件,将暴露给客户端的接口在这个 AIDL 文件中声明 3.最后在 Service 中实现这个 AIDL 接口即可。
二、客户端 首先需要绑定服务端 Service(建立连接 ServiceConnection),绑定成功后,将服务端返回的 Binder 对象转成所属的类型,接着就可以调用 AIDL 中的方法了。
五、startService()和bindService()区别1.执行startService时,Service会经历onCreate->onStartCommand
。 当执行stopService时,直接调用onDestroy方法。调用者如果没有stopService,Service会一直在后台运行,下次调用者再起来仍然可以stopService。
2.执行bindService时,Service会经历onCreate->onBind
。这个时候调用者和Service绑定在一起。调用者调用unbindService方法或者调用者Context不存在了(如Activity被finish了),Service就会调用onUnbind->onDestroy。这里所谓的绑定在一起就是说两者共存亡了。
3.多次调用startService,该Service只能被创建一次,即该Service的onCreate方法只会被调用一次。但是每次调用startService,onStartCommand方法都会被调用。Service的onStart方法在API 5时被废弃,替代它的是onStartCommand方法。
4.第一次执行bindService时,onCreate和onBind方法会被调用,但是多次执行bindService时,onCreate和onBind方法并不会被多次调用,即并不会多次创建服务和绑定服务。