AIDL使用方法记录
2015-11-19 16:19
633 查看
AIDL介绍:用于不同进城之间的数据交换,方法调用。例如:一个app运行过程中都会使用一个进程,不同的app之间需要进行对象传递则需要使用到AIDL。
类似于进程与进程之间的回调,当然这个过程需要借助AIDL来统一两个进程之间的接口。
详细步骤:
首先需要明确哪个是客户端app,哪个是服务端app,客户端app是需要拿到通过AIDL传递的对象的,而服务端app则是提供者
1.在服务端app内创建AIDL文件:创建aidl文件夹
如图,Android studio中有直接创建aidl文件夹的选项,然后在文件夹内创建包,在包内创建aidl文件即可;
2.在aidl文件中添加方法:添加需要实现的方法即可,与在普通接口文件中创间方法相同package com.example.myapplication;
interface ILiAidlInterface {
//导入该AIDL
import com.example.myapplication.ILiAidlInterface;
public class MyService extends Service {
public MyService() {
}
private IBinder mIBinder = new te();
@Override
public IBinder onBind(Intent intent) {
return mIBinder;
}
private class te extends ILiAidlInterface.Stub {
@Override
public void checkName(int bookNo) throws RemoteException {<pre name="code" class="java"><span style="white-space:pre"> </span>Log.e("service", "checkName方法");
} }}
注意需要对该service进行静态注册,这样可以使用其他的app与其绑定:
<service
android:name=".MyService"
android:enabled="true"
android:exported="true">
<intent-filter>
<action android:name="com.example.aidlservice.service"/>
</intent-filter>
</service>
至此服务端完成,可以先将其部署到手机上。
4.客户端app的aidl文件创建:
这里需要注意的是两个文件需要完全相同,包名也是一样的,否则容易出现Binder invocation to an incorrect interface该错误。
5客户端代码编写:
首先需要将包引入,在该activity与service绑定的时候对AIDL进行实例化,从而即可使用该接口调用接口内的方法
这样部署完客户端app,先将点击button将service绑定,然后点击另一个button即可执行另一个进程内个的service的方法
类似于进程与进程之间的回调,当然这个过程需要借助AIDL来统一两个进程之间的接口。
详细步骤:
首先需要明确哪个是客户端app,哪个是服务端app,客户端app是需要拿到通过AIDL传递的对象的,而服务端app则是提供者
1.在服务端app内创建AIDL文件:创建aidl文件夹
如图,Android studio中有直接创建aidl文件夹的选项,然后在文件夹内创建包,在包内创建aidl文件即可;
2.在aidl文件中添加方法:添加需要实现的方法即可,与在普通接口文件中创间方法相同package com.example.myapplication;
interface ILiAidlInterface {
//需要暴露给客户端app的方法 void checkName( int bookNo); }3.在服务端app的service中实现该方法:
//导入该AIDL
import com.example.myapplication.ILiAidlInterface;
public class MyService extends Service {
public MyService() {
}
private IBinder mIBinder = new te();
@Override
public IBinder onBind(Intent intent) {
return mIBinder;
}
private class te extends ILiAidlInterface.Stub {
@Override
public void checkName(int bookNo) throws RemoteException {<pre name="code" class="java"><span style="white-space:pre"> </span>Log.e("service", "checkName方法");
} }}
注意需要对该service进行静态注册,这样可以使用其他的app与其绑定:
<service
android:name=".MyService"
android:enabled="true"
android:exported="true">
<intent-filter>
<action android:name="com.example.aidlservice.service"/>
</intent-filter>
</service>
至此服务端完成,可以先将其部署到手机上。
4.客户端app的aidl文件创建:
这里需要注意的是两个文件需要完全相同,包名也是一样的,否则容易出现Binder invocation to an incorrect interface该错误。
5客户端代码编写:
首先需要将包引入,在该activity与service绑定的时候对AIDL进行实例化,从而即可使用该接口调用接口内的方法
//导入AIDL包 import com.example.myapplication.ILiAidlInterface; public class MainActivity extends Activity { private ILiAidlInterface a; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); } //对应button的点击事件,将该activity与service绑定 public void bind(View view) { Intent service = new Intent("com.example.aidlservice.service");//指定到相应的service bindService(service, new ServiceConnection() { @Override public void onServiceConnected(ComponentName name, IBinder service) { a = ILiAidlInterface.Stub.asInterface(service);//实例化接口 } @Override public void onServiceDisconnected(ComponentName name) { <span style="white-space:pre"> </span>a=null; } }, BIND_AUTO_CREATE); } //对应button的点击事件,执行aidl接口内的方法 public void fun1(View view) throws RemoteExce 4000 ption { a.checkName(1); } }
这样部署完客户端app,先将点击button将service绑定,然后点击另一个button即可执行另一个进程内个的service的方法
相关文章推荐
- 使用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