安卓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 {
}
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() {
};
}
其次就是aidl文件,这个aidl文件的内容名字以及包名要和客户端的一模一样。
如下图:
最主要是配置mainfest文件的内容(我就是在这里搞了几天),因为大家都知道两个app的类是不能互相调用的,即a程序不能调用b程序的c类,所以我们的intent就不能直接去绑定b的service类,因此就需要配置service的组件,可以看到我们客户端是通过action来进行指定服务端的service,因此配置如下图:
上图可以看出来我们配置了service中的action,这个action是我们自己写的一串字符串,其他进程就是通过暴露的接口来进行调用。至于process(这是开启新的进程,主要是因为一个进程的内存有限,所以开辟新的内存空间(有点扯远了))。然后剩下的就是在手机上同时装这两个app,然后在点击按钮就能获得另一个app的值,这样就成功进行通信了。
附言:记住aidl文件的内容必须一致,还有就是aidl的包名还有文件名必须一致。
我们写一个例子进行两个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的包名还有文件名必须一致。
相关文章推荐
- 使用C++实现JNI接口需要注意的事项
- Android IPC进程间通讯机制
- Android Manifest 用法
- [转载]Activity中ConfigChanges属性的用法
- Android之获取手机上的图片和视频缩略图thumbnails
- Android之使用Http协议实现文件上传功能
- Android学习笔记(二九):嵌入浏览器
- android string.xml文件中的整型和string型代替
- i-jetty环境搭配与编译
- android之定时器AlarmManager
- android wifi 无线调试
- Android Native 绘图方法
- Android java 与 javascript互访(相互调用)的方法例子
- android 代码实现控件之间的间距
- android FragmentPagerAdapter的“标准”配置
- Android"解决"onTouch和onClick的冲突问题
- android:installLocation简析
- android searchView的关闭事件
- SourceProvider.getJniDirectories