Aidl 的使用 简单 通讯

版权声明:富就富在不知足,贵就贵在能脱俗。贫就贫在少见识,贱就贱在没骨气。 https://blog.csdn.net/qq_33544860/article/details/77053580

记录点滴 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类就可以

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

有疑问 欢迎留言 :

有钱 欢迎打赏:

猜你喜欢

转载自blog.csdn.net/qq_33544860/article/details/77053580