android studio aidl用法详解
2016-07-07 09:45
615 查看
在我们android开发中经常会遇到进程间通信,android提供了一种解决方案就是aidl,下面我来介绍一下如何在android studio中实现aidl。1、在android studio中创建一个工程2、创建两个module 比如我的: aidlserver 和 aidlclient这样就能实现两个进程了。3、在aidlserver中的创建aidl文件见下图 4、在你新建的aidl中声明你的服务方法5、在java/pakagename下创建service(别忘了在mainfest中声明你的service)
public class MyService extends Service{ @Nullable @Override public IBinder onBind(Intent intent) { return new MyBinder(); } class MyBinder extends IMyAidlInterface.Stub{ @Override public void basicTypes(int anInt, long aLong, boolean aBoolean, float aFloat, double aDouble, String aString) throws RemoteException { System.out.println("get data from client:" + anInt + " " + aLong); } @Override public void sendObj(Student student) throws RemoteException { System.out.println("xixixixiixiixi"); } } }
6、将你的aidl包,直接copy到aidlclient中(客户端的aidl包必须和服务端一致,否则会序列化失败,无法bindservice)7、实现客户端和服务端的绑定代码
public class MainActivity extends AppCompatActivity { private IMyAidlInterface aidlService; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); } @Override protected void onResume() { super.onResume(); Intent intent = new Intent(); intent.setAction("cn.com.callServer"); bindService(intent, new MyConnection(), BIND_AUTO_CREATE); } public void callService(View view) { try { aidlService.basicTypes(15, 123, true, 887.3f, 563.5, "hello"); Student student = new Student(); student.setAge(12); student.setName("nihao"); aidlService.sendObj(student); } catch (RemoteException e) { e.printStackTrace(); } } class MyConnection implements ServiceConnection { @Override public void onServiceConnected(ComponentName name, IBinder service) { aidlService = IMyAidlInterface.Stub.asInterface(service); } @Override public void onServiceDisconnected(ComponentName name) { } } }
8、可以试着运行一下aidlserver和aidlclient,没有意外aidlclient可以成功调用aidlserver中的方法了。
注:大家有没有发现上面还有一个接口用到了Sudent类,对了下面我再重点介绍一下自定义对象如何在aidl中使用。
1、首先在aidlserver的aidl包中创建Student类(为什么放到这里,这样你就可以直接把aidl包发给客户端了省去了手动copy的麻烦)
Student一定要实现Parcelable接口,下面是我创建的Student对象
public class Student implements Parcelable{private String name;private String telNumber;private int age;public Student() {}public Student(Parcel pl){name = pl.readString();telNumber = pl.readString();age = pl.readInt();}public String getName() {return name;}public void setName(String name) {this.name = name;}public String getTelNumber() {return telNumber;}public void setTelNumber(String telNumber) {this.telNumber = telNumber;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}@Overridepublic int describeContents() {return 0;}@Overridepublic void writeToParcel(Parcel dest, int flags) {dest.writeString(name);dest.writeString(telNumber);dest.writeInt(age);}public static final Creator<Student> CREATOR = new Creator<Student>() {@Overridepublic Student createFromParcel(Parcel source) {return new Student(source);}@Overridepublic Student[] newArray(int size) {return new Student[size];}};}
2、在aidl的包下创建Student.aidl文件,下面是具体内容
package com.example.aidlserver; parcelable Student;
3、此时你去运行你的aidl会报错,log显示找不到Student的定义,没错现在你的Student在aidl包下,编译时不会去它下面找类,此时你需要做以下工作,在build.gradle文件中加入以下代码。同理你的aidlclient中也要加上。
sourceSets{main{java.srcDirs = ['src/main/java', 'src/main/aidl']}}
4、此时你再运行应该就不会出问题了。
总结:
以上是我个人开发的方式,如果能帮到大家是我的荣幸,如果大家不喜欢请忽略。
相关文章推荐
- android 判断真机还是虚拟机的方法汇总
- 解决首次启动程序白屏时间过长的问题(针对Android Studio Instant Run)
- android - RadioButton椭圆形背景样式和字体选择时候的颜色
- 解决Mac Androidstudio无法关联源码问题
- Android中线程同步之Mutex与Condtion的用法
- 解决Mac AndroidStudio无法关联源码问题
- Android 热补丁动态修复框架小结
- Android 自带ToolBar自定义中间标题&分类
- Android四大基本组件介绍与生命周期
- Android Listview显示混乱问题
- android获取状态栏高度为0的解决办法。
- Android使用Gson解析json时候的泛类型丢失问题
- Android Fragment完全解析,关于碎片你所需知道的一切
- Android模块化编程——WebView使用之与JavaScript交互
- 从log中分析Android wif连接状态的方法
- Android模块化编程——WebView使用之清理缓存
- Android Studio的安装和一系列基础设置
- Android模块化编程——WebView使用之系统返回键设置
- android 新控件使用
- Android系统启动过程