您的位置:首页 > 大数据 > 人工智能

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

2016-07-27 20:13 399 查看
简言:都知道安卓数据的传输有好多种,比如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的包名还有文件名必须一致。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  android aidl