首页 > 其他分享 >AIDL简单通讯模型

AIDL简单通讯模型

时间:2022-09-22 23:23:20浏览次数:52  
标签:通讯 AIDL IBinder 模型 TAG void public Log

新建一个AIDL服务端Project

将该Project命名为AIDL Server Application

新建一个AIDL接口文件

命名为ITestService

定义一个测试接口void test();

源码(包名是重点!!!)

package com.example.aidlserverapplication;

interface ITestService {

    void test();
}

定义好之后使用make project

新建一个服务

命名为MyService

重点:

打开AndroidManifest.xml

找到如下代码

<service
         android:name=".MyService"
         android:enabled="true"
         android:exported="true">
</service>

在上面的代码中添加如下代码

注意:android:name的属性一定要是该服务的全包名+类名!!!

<intent-filter>
    <action android:name="com.example.aidlserverapplication.MyService" />
</intent-filter>

定义一个IBinder对象

实现ITestService中的方法

源码如下:

private final IBinder mITestService = new ITestService.Stub() {
    @Override
    public void test() throws RemoteException {
        Log.d(TAG, "test: AIDL服务端被调用");
    }
};

重写onBind方法

返回上面实现的IBinder对象

源码如下:

@Override
public IBinder onBind(Intent intent) {
    Log.d(TAG, "onBind: 服务被绑定");
    return mITestService;
}

MyService所有源码

package com.example.aidlserverapplication;

import android.app.Service;
import android.content.Intent;
import android.os.IBinder;
import android.os.RemoteException;
import android.util.Log;

/**
 * AIDL服务(采用隐式启动)
 */
public class MyService extends Service {

    private final String TAG = MyService.class.getSimpleName();

    private final IBinder mITestService = new ITestService.Stub() {
        @Override
        public void test() throws RemoteException {
            Log.d(TAG, "test: AIDL服务端被调用");
        }
    };

    public MyService() {
    }

    @Override
    public void onCreate() {
        Log.d(TAG, "onCreate: 函数启动");
        super.onCreate();
    }

    @Override
    public IBinder onBind(Intent intent) {
        Log.d(TAG, "onBind: 服务被绑定");
        return mITestService;
    }
}

新建一个AIDL客户端Project

命名为AIDL Client Application

在原有的MainActivity中编写代码

在onCreate方法中,添加如下代码

这段代码的作用是绑定AIDL服务端实现的方法

Intent intent = new Intent("com.example.aidlserverapplication.MyService");
intent.setPackage("com.example.aidlserverapplication");
bindService(intent, mServiceConnection, Context.BIND_AUTO_CREATE);

定义 ServiceConnection 具体调用AIDL中实现的方法

源码如下,不难发现ServiceConnection也是上面绑定服务的关键

private final ServiceConnection mServiceConnection = new ServiceConnection() {
    @Override
    public void onServiceConnected(ComponentName name, IBinder service) {
        Log.d(TAG, "onServiceConnected: ");
        ITestService iTestService = ITestService.Stub.asInterface(service);
        try {
            Log.d(TAG, "onServiceConnected: 调用服务端函数");
            iTestService.test();
        } catch (RemoteException e) {
            e.printStackTrace();
        }
    }

    @Override
    public void onServiceDisconnected(ComponentName name) {

    }
};

销毁的时候记得解绑服务

@Override
protected void onDestroy() {
    super.onDestroy();
    unbindService(mServiceConnection);
}

标签:通讯,AIDL,IBinder,模型,TAG,void,public,Log
From: https://www.cnblogs.com/jarico/p/16721183.html

相关文章