美文网首页
Android — AIDL开发记录(一)

Android — AIDL开发记录(一)

作者: 许方镇 | 来源:发表于2021-02-24 10:28 被阅读0次

AIDL是指Android Interface definition language(接口定义语言),主要用于进程间的通信。

创建aidl文件

首先需要在和java同级的目录中建一个aidl文件夹,然后右键new出aidl文件。

image.png

新建的aidl文件默认会创建一个方法,告诉我们支持的基础类型有哪些

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);
}

aidl的简单使用

使用基础类型,创建一个方法getName

interface IMyAidlInterface {
   
   String getName(int age);
   
   void basicTypes(int anInt, long aLong, boolean aBoolean, float aFloat,
           double aDouble, String aString);
}

因为aidl是用于进程间通信的,所以需要把这个aidl拷贝到另一个进程中(可以新建工程),需要保证两个进程中aidl文件的包名一致,不然会报错。

rebuild项目后,会发现自动生成了相应的java接口


image.png

服务端进程创建Service和返回Binder

public class MyService extends Service {

    @Override
    public IBinder onBind(Intent intent) {
        return new MyBinder();
    }

    class MyBinder extends IMyAidlInterface.Stub {

        @Override
        public String getName(int age) throws RemoteException {
            return age > 30 ? "老王" : "小王";
        }

        @Override
        public void basicTypes(int anInt, long aLong, boolean aBoolean, float aFloat, double aDouble, String aString)
                throws RemoteException {

        }
    }

}

在AndroidManifest.xml中注册Service

<service android:name=".MyService">
    <intent-filter>
        <actaion android:name="com.xfz.aidlapplication.MyService123" />
    </intent-filter>
</service>

客户端创建ServiceConnection并绑定服务

首先创建intent,

  • 可以使用Component,传入包名和服务类名
Intent intent = new Intent();
intent.setComponent(new ComponentName("com.xfz.aidlapplication", "com.xfz.aidlapplication.MyService"));
  • 也可以使用Action和Package
Intent intent = new Intent();
intent.setAction("com.xfz.aidlapplication.MyService123");
intent.setPackage("com.xfz.aidlapplication");

绑定和调用

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        Intent intent = new Intent();
        intent.setComponent(new ComponentName("com.xfz.aidlapplication", "com.xfz.aidlapplication.MyService"));
//        intent.setAction("com.xfz.aidlapplication.MyService123");
//        intent.setPackage("com.xfz.aidlapplication");
        bindService(intent, mConnection, Service.BIND_AUTO_CREATE);

    }

    private ServiceConnection mConnection = new ServiceConnection() {
        @Override
        public void onServiceConnected(ComponentName name, IBinder service) {
            //在服务连接成功后进行调用
            IMyAidlInterface mIntentionPlus = IMyAidlInterface.Stub.asInterface(service);
            try {
                Log.d("xfz", "name = " + mIntentionPlus.getName(35));
            } catch (RemoteException e) {
                e.printStackTrace();
            }
        }

        @Override
        public void onServiceDisconnected(ComponentName name) {

        }
    };

}

相关文章

网友评论

      本文标题:Android — AIDL开发记录(一)

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