Androd binder机制需注意

<1>Binder是android 中的一个类,实现了Ibinder接口,是android中的一种跨进程通信方式。从framework 角度来说,binder是servicemanager连接各种manager(ActivityManager,windowsmanager,packagemanager等)和ManagerService的桥梁,用代码表示就是:

//ServiceManager非系统权限不能直接使用,可用反射
IBinder b = ServiceManager.getService("activity");
      IActivityManager am = IActivityManager.Stub.asInterface(b);

ServiceManager是管理系统中的各种系统service(ActivityManagerService等)的类

<2>android 应用层实现是通过AIDL实现binder:

1.定义aidl文件接口

2.编译器自动生成实现类

3.在service中实现onbind方法,返回Binder实现类

编译器自动生成aidl文件实现类,是通过实现IInterface接口

内部有个静态的Stub类,继承Binder实现上面的类,代码如下:

public interface IBookManager extends android.os.IInterface
{
/** Local-side IPC implementation stub class. */
public static abstract class Stub extends android.os.Binder implements IBookManager 
{
private static final java.lang.String DESCRIPTOR = "packagename.IBookManager";
/** Construct the stub at attach it to the interface. */
public Stub()
{
this.attachInterface(this, DESCRIPTOR);
}

public static IBookManager asInterface(android.os.IBinder obj){}
@Override public IBinder asBinder(){}

@Override public boolean onTransact(int code, android.os.Parcel data, android.os.Parcel reply, int flags) throws android.os.RemoteException
{
...
private static class Proxy implements IBookManager 
{}
}
...
}

可以知道主要工作都是Stub类,系统已经帮助实现binder细节,所以只需要在代码中实现Stub类就行,注意onTransact是在binder线程池中执行,客户端方法调用是阻塞的,如果方法很耗时,不能在ui线程中发起请求调用,(可以在aidl方法中加oneway关键字就不会阻塞,具体细节百度)

<3>给binder设置死亡代理:binder运行在服务端进程,如果服务端进程异常终止,客户端就不能工作,所以需要设置一个死亡代理得到通知,客户端就可以从新请求连接

private IBinder.DeathRecipient mDeathRecipient =new IBinder.DeathRecipient(){
@Override
public void binderDied(){
if(mBookManager==null) return;
mBookManager.asBinder().unlinkToDeath(mDeathRecipient ,0);
mBookManager=null;
//重新绑定Service
}

mservice=IBookManager.Stub.asInterface(binder);
binder.linkToDeath(mDeathRecipient ,0);

另外binder.isBinderAlive();可以判断Binder是否死亡

猜你喜欢

转载自blog.csdn.net/kingyc123456789/article/details/52239347