Aidl 的使用 简单 通讯
2017-08-10 17:38
459 查看
记录点滴 AIDL 简单案例
离开久了 有点忙 是时候坚持一周一篇博客了 20170809 记录自己的点滴(未经本人允许禁止转发)
目录
写这篇文章的原因是:有个需求: 弄一个接口出来 让第三方App 自己调用 需要打开就打开 需要关闭就关闭
记性不好 生怕自己过后又忘记
源码编译和一般人写的adil不一样!!!!!!!!!!!
正文部分:
既然是要提供接口出去 用 aidl 也不错的一个选择最近在负责SystemUI这一模块 有个需求需要去控制 虚拟按键是否可点击/是否可见;虚拟按键是否可见大家都应该知道怎么去做(不会的自己百度哦)
要控制是否可点击这个就需要修改SystemUI的源码了. 既然是SystemUI,那么就需要用源码来进行编译(反人类的反编译的一边去!).
需要调用系统App级别的方法或者一些接口都可以这样做.(反射的,一边待着)
需要学aidl的接着看:
插话:这里不对aidl的专业术语进行一个解析 需了解(出门右拐上百度)
直接点就是:两个app之间通讯的桥梁 提供接口给第三方
[如果你也在搞系统模块 同样需要提供接口 那么你很幸运]
创建工程(Aidl的服务端)
1.用AndroidStudio新建一个工程 工程名字随项目定例如:SystemUITest2.打开SystemUITest的工程路径把main目录里的文件全部去掉
例如:/AndroidStudioProjects/SystemUI/app/src/main/ delete所有
3.把负责的模块源码拷贝到main目录下,并且把src文件名修改成java(最终结果如下图:)
建立AIDL
用AndroidStudio打开SystemUITest工程 报错请忽略 因为我们使用源码编译的,使用AndroidStudio只是为了方便生成Stub类(暂时不用源码去搞)在工程中创建aidl文件:
– 定义好aidl的包名
–右击包名 new>aidl>aidl file
创建完成aidl 打开.aidl文件 注释掉basicTypes()方法 添加自己需要提供出去的接口,l例如:clickNavigationBarHome(boolean click)
basicTypes()方法只是说明能通讯可传递的参数类型
然后同步一下工程 会在以下目录生成.java文件
1.以上所做的一切只是为了得到IMyAidlInterface.java
接下来把IMyAidlInterface.java文件拷贝到我们的工程中 注意需要创建包名要和该文件的包名一致(报错请忽略)
至于AndroidStudio中的aidl文件夹 是提供给第三方的使用的 这里可以告一段落了
紧接着就是我们的接口的具体实现了 在工程中创建一个服务,记得在AndroidManifest中声明哦
接着看一下服务端接口的实现:可以参考一下代码:
public class YyyNavigationBarService extends Service { //服务的Action final String Action = "com.systemui.adb"; @Override public IBinder onBind(Intent intent) { if(intent.getAction().equals(Action)) { return mIBinder; } return null; } @Override public boolean onUnbind(Intent intent) { return super.onUnbind(intent); } @Override public void onDestroy() { super.onDestroy(); } @Override public void onCreate() { super.onCreate(); } private final IBinder mIBinder = new IMyAidlInterface.Stub() { @Override public void clickNavigationBarHome(boolean click)throws RemoteException { /*** *具体实现自己写啦 这里就是第三方调用接口后 服务端收到的处理 */ } }; }
最后打开SystemUITest工程文件夹 main目录下 把java文件名改成src 除了aidl文件夹以外,复制所有文件,替换源码上的SystemUI工程 编译生成SystemUI.apk 再push到系统中
到此服务端完成
客服端(第三方app)
如果不是你使用该接口,那么恭喜你你可以下班了,下班前需要把接口提供给第三方;直接把aidl文件中的.aidl文件给他就行了.然并卵 总得要验证吧 那么这就简单啦
第三方如果是AndroidStudio工程 就是不需要源码编译的 在工程中随意创建一个aidl注意包名需要和 接口文件.aidl文件中的包名一致 然后替换上面提供的.aidl文件
接着如下绑定远程服务 调用接口 例如:
public class NavigationBarManager { final String Action_ADD = "com.systemui.adb"; IMyAidlInterface mService = null; public void bindService(Context context) { mContext = context; context.bindService(new Intent(Action), serviceConnection, Context.BIND_AUTO_CREATE); } Context mContext = null; public void unbindService() { if (mContext != null) { mContext.unbindService(serviceConnection); } } public int click(boolean click) { if (mService == null) return 0; try { return mService.clickNavigationBarHome(click); } catch (Exception e) { return 0; } } private ServiceConnection serviceConnection = new ServiceConnection() { @Override public void onServiceDisconnected(ComponentName name) { mService = null; } @Override public void onServiceConnected(ComponentName name, IBinder service) { mService = IMyAidlInterface.Stub.asInterface(service); } }; }
第三方调用接口的时候 先去绑定服务 接着用NavigationBarManager的对象 调用click(boolean click)这个方法即可.
警告 尿急!必须上厕所了
附加:如果你的第三方apk也需要在源码编译呢?
- 把上面aidl文件夹的内容拷贝搞src/文件夹内
- 在mk文件中添加声明:例如:
- 实现接口还是仿照NavigationBarManager类就可以
一个下午就写这一点…..有点恶心
有疑问 欢迎留言 :
有钱 欢迎打赏:
相关文章推荐
- 四大组件之service简单介绍和AIDL的简单使用
- 一个AIDL的简单使用
- Java简单工具:UDP通讯工具类(测试使用)
- 一个简单的demo学习Android远程Service(AIDL的使用)
- 一个简单的HTTP通讯的例子,使用了CInternetSession,CHttpConnection,CHttpFile三个类。
- 一个简单的demo学习Android远程Service(AIDL的使用)
- 一个简单的demo学习Android远程Service(AIDL的使用
- Android aidl简单使用
- 使用AIDL实现IPC通信之——简单调用远程服务的方法
- 使用Net类库,实现的基于TCP/IP简单的通讯框架框架(一)
- IPC 主要是messenger和aidl的使用和简单分析
- 利用线程使用 ServerSocket 和 Socket 简单双向通讯
- iOS - 融云即时通讯的简单使用
- Aidl 进程间语言的简单使用与demo
- 线程间通讯 wait notify notifyAll简单使用
- Android Service AIDL 简单使用
- aidl的简单使用
- android AIDL的简单使用
- android学习之使用AIDL实现进程间的通讯
- Unity使用C#实现简单Scoket连接及服务端与客户端通讯