安卓aidl夸进程通信的小例子,

简言:都知道安卓数据的传输有好多种,比如bundle,intent,handler以及其他一些,但是这些是在一个进程上运行的,如果我们需要不同进程传输数据(通信),这时候我们就需要用到aidl(Android Interface Definition Language)语言进行编写,这就是涉及到安卓底层的ipc通信中的bindler,废话不多说了(bindler回去自己了解)。
我们写一个例子进行两个app的通信:
cilent代码:
public class MainActivity extends Activity {

gg g;
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    final TextView t=(TextView)findViewById(R.id.t);
    Button b=(Button)findViewById(R.id.b);

    b.setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View v) {
            // TODO Auto-generated method stub
            int cc;
            try {
                cc = g.add(5, 2);
                t.setText(""+cc);
            } catch (RemoteException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }

        }
    });
    //t.setText(""+android.os.Process.myPid()+"   "+h.add(1,2));
    Intent intent=new Intent();
    intent.setAction("com.example.aidl.gg");//service中的action,自己设置的。
    intent.setPackage("com.example.aidl");//com.lypeer.ipcserver
    bindService(intent, s, BIND_AUTO_CREATE);//绑定服务,第二个参数是服务连接上的参数,第三个是自动创建的
}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    // Inflate the menu; this adds items to the action bar if it is present.
    getMenuInflater().inflate(R.menu.main, menu);
    return true;
}
private ServiceConnection s=new ServiceConnection() {

    @Override
    public void onServiceDisconnected(ComponentName name) {
        // TODO Auto-generated method stub
        g=null;
    }

    @Override
    public void onServiceConnected(ComponentName name, IBinder service) {
        // TODO Auto-generated method stub
        //拿到远程服务,gg为aidl的文件
        g=gg.Stub.asInterface(service);
    }
};

}
aidl文件:你可以创建一个文件夹,但是最主要的是该文件夹的名字和服务端的aidl文件名要一样。
aidl代码(后缀名为aidl):package com.example.process;
interface gg {
int add(int a,int b);
}
这样就算写好了客户端的。客户端就不需要配置什么东西了
service服务端的:首先先创建一个新的安卓project,然后在创建一个类继承service,如下:

“`
public class ser extends Service{
@Override
public IBinder onBind(Intent intent) {
// TODO Auto-generated method stub
return bandler;
}
//获取ibandler的接口,
private IBinder bandler=new gg.Stub() {

@Override
public int add(int a, int b) throws RemoteException {
    // TODO Auto-generated method stub
    return a+b;
}

};
}
其次就是aidl文件,这个aidl文件的内容名字以及包名要和客户端的一模一样。
如下图:这里写图片描述

最主要是配置mainfest文件的内容(我就是在这里搞了几天),因为大家都知道两个app的类是不能互相调用的,即a程序不能调用b程序的c类,所以我们的intent就不能直接去绑定b的service类,因此就需要配置service的组件,可以看到我们客户端是通过action来进行指定服务端的service,因此配置如下图:这里写图片描述
上图可以看出来我们配置了service中的action,这个action是我们自己写的一串字符串,其他进程就是通过暴露的接口来进行调用。至于process(这是开启新的进程,主要是因为一个进程的内存有限,所以开辟新的内存空间(有点扯远了))。然后剩下的就是在手机上同时装这两个app,然后在点击按钮就能获得另一个app的值,这样就成功进行通信了。
附言:记住aidl文件的内容必须一致,还有就是aidl的包名还有文件名必须一致。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值