AIDL基础再接触
来源:互联网 发布:手机淘宝体验中心在哪 编辑:程序博客网 时间:2024/05/22 03:37
AIDL基础再接触
这两天再学习aidl的时候发现两个进程怎么都连接不上,于是看之前写过一篇关于aidl的文章,发现没什么卵用!于是算是又学习了一篇发现了一些细节的东西必须要注意的,再写一篇加深记忆!关于aidl他喵的其实就是一个辅助生成binder类的工具!意思就是,你是用aidl其实就是想要生成一个binder类来进行通信,如果你足够了解或者参考自动生成binder的话,不适用aidl也完全是可以的。那先把话题扯到binder中:根据Android艺术探索一书中提到,binder是一个非常复杂的东西,建议小白对binder只需要了解和掌握基本的使用。binder可以理解为一盒装满工具的工具箱。打比方说,这个工具箱在服务器那里,而客户端想用到里面的工具,那怎么办?服务端把工具箱传给客户端呗。所以我认为进程之间使用aidl的通信,本质上就是传递binder对象(工具箱)的通信。那么该如何传递这个binder对象?对于服务端:必须要有binder类(工具箱)给服务端使用嘛,那怎么传递给想要他的客户端呢?使用Service,客户端通过绑定服务端service能够就能都返回这个binder对象了。那先在思路算是清晰了。(创建binder+创建Service)那接下来服务端具体法你怎么做:
服务端
1:创建binder类:如果你还是小白,那就是用aidl来辅助我们把。首先创建aidl文件(andriudstudio能直接新建aidl文件),定义接口。
package com.example.administrator.aidlservice;import com.example.administrator.aidlservice.Book;interface IBookManager { Book getBook();}
再贴一下我的类结构:
注意:如果牵扯到自定义类的话,最好还是放到aidl文件夹下吧,并且也要创建这个自定义类的aidl文件,如图所示Book.aidl;里面的内容如下:
package com.example.administrator.aidlservice;parcelable Book;
并且你还要留意一下IBookManager这个aidl文件中还需要import这个Book类的,即使已经在同一包下。如果你不把他放在同一个包下的话,在客户端那边就比较难保持结构一致了。
Book类放在了aidl目录下会出现一个问题:无法查找到Book类,这应该是因为默认是从java目录下找类的吧,所以在grandle文件下配置一下,让他也从aidl中寻找类。
sourceSets{ mian{ java.srcDirs=['src/main/java','src/mian/aidl']; }}
这样的话,你放在aidl的Book类也能找到了。
编译一下,转到project形式,在app/build/generated/source/aidl/debug下面是否有自动生成对应aidl的java类。有的话创建binder类就成功了。没有的话就好好检查一下。
关于生成的binder类在下编文章说下
2:创建service
package com.example.administrator.aidlservice;import android.app.Service;import android.content.Intent;import android.os.IBinder;import android.os.RemoteException;public class AIDLService extends Service { public AIDLService() { } IBookManager.Stub bind = new IBookManager.Stub() { @Override public Book getBook() throws RemoteException { return new Book("life",56); } }; @Override public IBinder onBind(Intent intent) { // TODO: Return the communication channel to the service. return bind; }}
Stub是自动生成java类的内部类,创建binder对象重写自定义的接口。在onBind中返回该binder对象。在注册时候,加个action。最后别忘了开启这个服务。
客户端
把aidl的文件夹复制过来,保持结构、包名的一致。别忘了gandle中配置搜索的路径,然后通过action,packge绑定服务。
package com.example.administrator.aidlclient;import android.app.Service;import android.content.ComponentName;import android.content.Intent;import android.content.ServiceConnection;import android.os.Bundle;import android.os.IBinder;import android.os.RemoteException;import android.support.v7.app.AppCompatActivity;import android.util.Log;import android.view.View;import android.widget.Toast;import com.example.administrator.aidlservice.Book;import com.example.administrator.aidlservice.IBookManager;public class MainActivity extends AppCompatActivity { private IBookManager iBookManager; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); Intent intent = new Intent(); intent.setAction("aidlservice"); intent.setPackage("com.example.administrator.aidlservice"); ServiceConnection conn = new ServiceConnection() { @Override public void onServiceConnected(ComponentName name, IBinder service) { iBookManager = IBookManager.Stub.asInterface(service);//这个方法很讲究,放到下编讲,哈哈 } @Override public void onServiceDisconnected(ComponentName name) { } }; boolean b = bindService(intent, conn, Service.BIND_AUTO_CREATE); Log.d("liangshijie", "onCreate: "+b); } public void bindBtn(View view) { try { Book book = iBookManager.getBook(); Toast.makeText(this, book.toString(), Toast.LENGTH_SHORT).show(); } catch (RemoteException e) { e.printStackTrace(); } }}
拿到了接口类型的对象(工具箱)也就能够调用里面定义的方法了(使用工具)。
那这篇就讲到这,下编再细讲一下,稍微努力接近原理一点
0 0
- AIDL基础再接触
- Yii之再接触
- Python再接触
- Python再接触第二次
- AIDL详解之AIDL基础
- 再接触——数据结构和编译原理
- [ 生活杂感 ] 什么样的人尽量不要再接触
- 【南大软院大神培养计划】JS再接触
- 再接下来。。。
- Android中aidl基础
- Android--AIDL基础介绍
- Android AIDL基础用法
- AIDL ——基础概念
- 安卓aidl编程基础
- Android开发基础之AIDL教程实例
- Android基础——AIDL总结篇
- Android AIDL跨进程通信基础
- android基础部分再学习--AIDL
- 关于完数,亏数和盈数
- 龙虎榜这玩意本质上就是杀猪榜(鬼才信专栏)
- word-wrap与word-break的区别
- 【hpuoj】防ak问题
- LintCode - 365.二进制中有多少个1
- AIDL基础再接触
- MFC 判断Windows某一进程是否在运行以及处理
- 连接池笔记
- 有关EOF
- LA4487 Exclusive-OR
- @JoinColumn 详解
- Spring Cache的原理和简单实现
- 亲密数
- 欢迎使用CSDN-markdown编辑器