美文网首页
AIDL代码案例

AIDL代码案例

作者: 陈晨XX | 来源:发表于2017-03-08 20:44 被阅读56次

环境

开发工具:Android studio

整体的文件目录

Paste_Image.png

server端编写

1、在Java那边新建aidl文件,会自动生成和Java并列的aidl文件夹,包名也是一致的

Paste_Image.png

会自动生成代码

interface IMyAidlInterface {
    /**
     * Demonstrates some basic types that you can use as parameters
     * and return values in AIDL.
     */
    void basicTypes(int anInt, long aLong, boolean aBoolean, float aFloat,
            double aDouble, String aString);
}

不用管,加上自己的测试代码

interface IMyAidlInterface {
    /**
     * Demonstrates some basic types that you can use as parameters
     * and return values in AIDL.
     */
    void basicTypes(int anInt, long aLong, boolean aBoolean, float aFloat,
            double aDouble, String aString);
    //测试代码
    void myTest();
}

2、新建service文件,主要就是返回IBinder对象

public class myService  extends Service{
    @Override
    public void onCreate() {
        super.onCreate();
        Log.e("myService--->","onCreate");
    }

    private IBinder iBinder= new IMyAidlInterface.Stub() {
        @Override
        public void basicTypes(int anInt, long aLong, boolean aBoolean, float aFloat, double aDouble, String aString) throws RemoteException {

        }

        @Override
        public void myTest() throws RemoteException {
            Log.e("iiiiiiiii--->","yeyeyyeyeyeyeye");
        }
    };

    @Nullable
    @Override
    public IBinder onBind(Intent intent) {
        return iBinder;
    }
}

3、注册service

<service android:name="com.renrun.service.myService"
                 android:enabled="true"
                 android:exported="true"
                 android:process=":remote">
            <intent-filter>
                <action android:name="com.renrun.service.myService"/>
                <category android:name="android.intent.category.DEFAULT" />
            </intent-filter>

</service>

android:enabled  当前Activity是否可以被另一个Application的组件启动:true允许被启动;false不允许被启动。
只要有filter,默认值就是true,否则是false

android:exported 其它应用的组件是否可以唤醒service或者和这个service进行交互:true可以,false不可以
只要有filter,默认值就是true,否则是false

android:process 标志在哪个线程,:开头表示是私有的,会补上包名,和com.renrun.service.remote相比,就是公有和私有的区别。

action android:name 表示可以通过这个名称来启动这个service
category android:name 是默认的模式

client端编写

1、拷贝service端的aidl整个文件夹到同样的地方。
2、调用服务,初始化变量

  IMyAidlInterface iMyAidl;
        private ServiceConnection conn=new ServiceConnection() {
        @Override
        public void onServiceConnected(ComponentName name, IBinder service) {
            Log.d("cyqlog", "onServiceConnected success");
            iMyAidl=IMyAidlInterface.Stub.asInterface(service);  //  1

        }

        @Override
        public void onServiceDisconnected(ComponentName name) {
            Log.d("cyqlog", "onServicedisConnected ");
            iMyAidl=null;
        }
    };

调用

 Intent intent = new Intent();
        //绑定服务端的service
        intent.setAction("com.renrun.service.myService");
//        intent.setPackage("com.renrun.service");
        //新版本(5.0后)必须显式intent启动 绑定服务
        intent.setComponent(new ComponentName("com.renrun.service","com.renrun.service.myService"));
        startService(intent);
        //绑定的时候服务端自动创建
        bindService(intent,conn, Context.BIND_AUTO_CREATE);

        Boolean b = bindService(intent,conn, Context.BIND_AUTO_CREATE);
        Log.e("i00---00-90------>","1-->"+b);
        new Handler().postDelayed(new Runnable(){
            public void run() {
                try {
                    iMyAidl.myTest();
                } catch (Exception e1) {
                    e1.printStackTrace();
                }
            }
        }, 1000);

特别注意:

按照正常的流程startService(intent);是不需要的,
但是魅族是个奇葩,没有startService(intent); bindService返回绑定失败,所以通用写法一定要加上。

测试运行

先运行server,再运行oo,能看到service日志打印。

相关文章

  • AIDL代码案例

    环境 开发工具:Android studio 整体的文件目录 server端编写 1、在Java那边新建aidl文...

  • AIDL实现进程间通讯(Android 同步调用)

    服务端代码: AIDL接口:IAIDLConfigService.aidl Android.mk中增加对AIDL文...

  • aidl的使用

    aidl server端代码 client端

  • IPC之AIDL分析

    AIDL用法及代码分析 AIDL为安卓接口定义语言的简称,作用是利用binder机制,实现IPC。 1、AIDL用...

  • Android AIDL 从入门到精通

    AIDL 是 Android 特有的 IPC 进程间通讯方式 AIDL 的写法其实和绑定服务的代码差不多,IBan...

  • 跨进程间如何进行AIDL IPC 通信(四)

    在前三篇博客中,我们介绍了如何进行AIDL IPC通信,代码设计及AIDL数据传输的类型。在第一篇博客代码设计中,...

  • AIDL - 简介

    本文仅作为 AIDL 的初步了解与具体代码实现的讲解。并未深入IPC原理、Binder原理等。 一、概述 AIDL...

  • AIDL连接池

    一、开始使用 1、获取代码 2、初始化 3、编写自己的aidl文件,可以参考demo 4、完成自己的aidl查找功...

  • AIDL的proxy/Stub原理

    Proxy 首先看一下aidl的gen的代码: 这个是我们获得server binder对象的代码,从这段代码可以...

  • Aidl跨进程调用小结

    近期开发应用SDK时因为数据安全和代码封装的考虑,尝试用AIDL做了一个简单的跨进程调用接口框架。Aidl的基础使...

网友评论

      本文标题:AIDL代码案例

      本文链接:https://www.haomeiwen.com/subject/bcligttx.html