您的位置:首页 > 大数据 > 人工智能

Aidl 的使用 简单 通讯

2017-08-10 17:38 459 查看

记录点滴 AIDL 简单案例

离开久了 有点忙 是时候坚持一周一篇博客了 20170809 记录自己的点滴

(未经本人允许禁止转发)

目录

写这篇文章的原因是:

有个需求: 弄一个接口出来 让第三方App 自己调用 需要打开就打开 需要关闭就关闭

记性不好 生怕自己过后又忘记

源码编译和一般人写的adil不一样!!!!!!!!!!!

正文部分:

既然是要提供接口出去 用 aidl 也不错的一个选择

最近在负责SystemUI这一模块 有个需求需要去控制 虚拟按键是否可点击/是否可见;虚拟按键是否可见大家都应该知道怎么去做(不会的自己百度哦)

要控制是否可点击这个就需要修改SystemUI的源码了. 既然是SystemUI,那么就需要用源码来进行编译(反人类的反编译的一边去!).

需要调用系统App级别的方法或者一些接口都可以这样做.(反射的,一边待着)

需要学aidl的接着看:

插话:这里不对aidl的专业术语进行一个解析 需了解(出门右拐上百度)

直接点就是:两个app之间通讯的桥梁 提供接口给第三方

[如果你也在搞系统模块 同样需要提供接口 那么你很幸运]

创建工程(Aidl的服务端)

1.用AndroidStudio新建一个工程 工程名字随项目定例如:SystemUITest

2.打开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类就可以

一个下午就写这一点…..有点恶心

有疑问 欢迎留言 :



有钱 欢迎打赏:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  aidl