Android Binder的极简使用

进程间通信很多同学都使用到AIDL,这个是对Binder进行了一层封装。其实剥开AIDL,刺果果的使用Binder,有种很简单的方式,不过最好是系统应用,因为看Android版本的提升,在安全方面一直在完善,不排除以后只能系统权限才能使用这种方式。好了,Read the code~

服务端,首先要有一个Binder类,然后重写onTransact
public class MyBinder extends Binder {

String TAG = "MyBinder";
private Context context = null;

public MyBinder(Context context) {
    // TODO Auto-generated constructor stub
    this.context = context;
}

@Override
protected boolean onTransact(int code, Parcel data, Parcel reply, int flags) throws RemoteException {
    
switch (code) {
    case 0://
            //int len = data.readInt();
            reply.writeInt(1);
        Log.d(TAG, "onTransact case 0");
return true;

    case 1://           
        
return true;
  }

  return super.onTransact(code, data, reply, flags);
}

}

接着,搞一个服务,通过反射调用系统方法将其添加到servicemanager,早期Android版本貌似有直接的API,现在都需要反射调用了。

IBinder mb = new MyBinder(context) ;

    try {
        Class<?>  serviceManager = Class.forName("android.os.ServiceManager");
        Method method=serviceManager.getMethod("addService", String.class, IBinder.class);
        
        method.invoke(null, "testService", mb);
        Log.d(TAG, "add testService to systemservice");
    } catch (Exception e) {
        // TODO Auto-generated catch block
        Log.i(TAG, "add testService fail");
        e.printStackTrace();
    }

服务端差不多就这样了,看看客户端怎么和这个玩意儿通信

先获取服务,
try {
Class<?> serviceManager = Class.forName("android.os.ServiceManager");
Method method=serviceManager.getMethod("getService", String.class);
ibinder = (IBinder) method.invoke(null, "testService");
Log.i("wwwwwww", "get testService success ibinder:"+ibinder);
} catch (Exception e) {
// TODO: handle exception
Log.i("wwwwwww", "get testService fail");
}

接着,这样使用
Parcel data =Parcel.obtain();
Parcel reply=Parcel.obtain();
byte[] cmdsetb = {0x02,0x02,0x21,0x44,0x02,0x14,0x09,0x42,0x08,0x00,0x00,0x20};

    data.writeInt(12);
    data.writeByteArray(cmdsetb);
    
    try {
         boolean c = ibinder.transact(0, data, reply, 0);
         int ir = reply.readInt();          
    } catch (RemoteException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }catch (Exception e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

这就把数据(data)发过去了,然后服务端可以通过replay返回数据;第一个参数是code;最后一个是flags,表示同步或异步。

是不是比封装AIDL简单。了解AIDL的同学看到上面的代码可能会注意到一点,就是服务端返回数据,即可对应到AIDL的out回传方式。差别在于AIDL是回传引用,所以像上面代码直接往replay写int那样的方式AIDL就做不到了。AIDL的话可以new一个类,传引用回去。

============================================================
客户端和服务端绑定后,可以监听服务端的状态,当服务端因为异常停止后,能收到死亡通知。如下
直接用binder的linkToDeath

     try {
        ibinder.linkToDeath(deathHandle, 0);
    } catch (RemoteException e2) {
        // TODO Auto-generated catch block
        e2.printStackTrace();
    }

final DeathRecipient deathHandle = new DeathRecipient(){

    @Override
    public void binderDied() {
        // TODO Auto-generated method stub
        Log.i("wwss", "binder is died");
    }
     
 };

这样,当服务端崩溃的时候,binder断开,即可接收到死亡通知。

如果是服务端需要监听客户端是否崩溃、被kill呢,又该如何?
那就有点不同了,因为客户端是不确定的,所以需要客户端注册一个binder进来。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,098评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,213评论 2 380
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,960评论 0 336
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,519评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,512评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,533评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,914评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,574评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,804评论 1 296
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,563评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,644评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,350评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,933评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,908评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,146评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,847评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,361评论 2 342