新建AIDL文件,aidl文件会自动生成包含stub类的文件
写一个service类,内部类binder实现类继承stub,实现aidl中的方法(调用service内方法);service类内实现onBind方法,返回这个内部binder类的实例;配置service在AndroidManifest中,service中配置process属性,配置类似:service,程序运行时将为这个service新启动进程.
需要注意的是,Manifest中service的intent-filter中的写法,目前高版本的SDK不允许使用模糊的filter写法来启动service(防止被其它应用启动),建议目前不配置intent-filter,直接使用类名来启动service
-
连接启动service的客户端,首先需要实现一个ServiceConnection,在这个类的onServiceConnected方法中,保存返回的binder:
@Override public void onServiceConnected(ComponentName name, IBinder service) { mImServiceBinder = IMServiceB.Stub.asInterface(service); }
然后是绑定service:bindService(intent, mConnection, Context.BIND_AUTO_CREATE);
绑定之后,onServiceConnected会被调用,我们就获得了跟service交互的binder.
需要注意的是,startService和bindService创建出来的service的生命周期是不同的.
startService启动的服务的生命周期跟客户端无关(即使后面再次被bind),而通过bindService启动的服务一旦所有的客户端都unbind之后,将自动销毁.已经被start的服务再次被调用start,将不会调用onCreate,但是会再次调用onStartCommand方法.
4.对于复杂的数据传递,需要数据类实现Parcelable接口(自定义序列化).
5.一个程序启动多个远程服务进程,每个进程都有自己的applicationContext,除了通过AIDL方法,两个进程不能通过其他方法共享数据(数据库可以,sharedPreferences应该也可以?).