自动化零件商城(www.rssme.com)专业PLC,变频器,直线模组,触摸屏,控制器,传感器等自动化商品网上购物商城,为广大中小工业企业提供优质、低价格和种类齐全的自动化零件。
文章目录

前言

Android 11用AIDL做一个服务端,多个客户端绑定测试时,跨进程绑定服务时死活无法绑定,看日志出现如下提示:

AppsFilter(  852): interaction: PackageSetting{cee307b com.biumall.client/10077} -> PackageSetting{e1dfefa com.biumall.musicservice/10078} BLOCKED

意思是BLOCKED了。

正文

解决方法

方法1:降低SDK版本

修改build.gradle,降低SDK版本为Android 29

我Android Studio版本太高了,提示至少要30才可以

方法2:修改软件可见性

在客户端的AndroidManifest.xml中新增如下配置(位置没有限制哈,仅仅客户端,服务端不需要!!)

<queries>
    <package android:name="com.biumall.client" />
    <package android:name="com.biumall.musicservice" />
</queries>

然后重新运行客户端代码即可绑定服务。

代码片段

顺便附上代码片段吧,只是简单的记录。

需求:一个AIDL服务端,存在多个客户端绑定

AIDL
ICar.aidl

// ICar.aidl
package com.biumall.musicservice;
import com.biumall.musicservice.ICarListener;

interface ICar {
    void addListener(ICarListener listener);
    void removeListener(ICarListener listener);
    int getStatus();
    void setStatus(int status);
}

ICarListener.aidl

// ICarListener.aidl
package com.biumall.musicservice;
interface ICarListener {
    void onCarStatus(int status);
}

服务端
CarService.java

package com.biumall.musicservice;


import android.app.Service;
import android.content.Intent;
import android.content.res.Configuration;
import android.os.Handler;
import android.os.IBinder;
import android.os.Looper;
import android.os.Message;
import android.os.RemoteException;
import android.util.Log;

import androidx.annotation.NonNull;
import androidx.annotation.Nullable;

import java.util.ArrayList;

public class CarService extends Service {
    private final String TAG = MusicApp.TAG + CarService.class.getSimpleName();
    private int mStatus = -1;
    private final ArrayList<ICarListener> mList = new ArrayList<>();

    @Nullable
    @Override
    public IBinder onBind(Intent intent) {
        Log.d(TAG, "onBind: ");
        return mCar;
    }

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

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        Log.d(TAG, "onStartCommand: ");
        return super.onStartCommand(intent, flags, startId);
    }

    @Override
    public void onDestroy() {
        super.onDestroy();
        Log.d(TAG, "onDestroy: ");
    }

    private final IBinder mCar = new ICar.Stub() {
        @Override
        public void addListener(ICarListener listener) throws RemoteException {
            Log.d(TAG, "addListener listener : " + listener);
            if (null != listener) {
                mList.add(listener);
            }
        }

        @Override
        public void removeListener(ICarListener listener) throws RemoteException {
            Log.d(TAG, "removeListener listener : " + listener);
            if (null != listener) {
                for (ICarListener carListener : mList) {
                    if (carListener.asBinder() == listener.asBinder()) {
                        mList.remove(listener);
                    }
                }
            }
        }

        @Override
        public int getStatus() throws RemoteException {
            Log.d(TAG, "getStatus mStatus : " + mStatus);
            return mStatus;
        }

        @Override
        public void setStatus(int status) throws RemoteException {
            Log.d(TAG, "setStatus mStatus : " + mStatus);
            mStatus = status;
            for (ICarListener listener : mList) {
                listener.onCarStatus(mStatus);
            }
        }
    };
}

AndroidManifest.xml

<service
    android:name=".CarService"
    android:enabled="true"
    android:exported="true">
    <intent-filter>
        <action android:name="com.biumall.musicservice.CAR_BIU_SERVICE" />
    </intent-filter>
</service>

客户端

服务绑定相关代码

private ICar mICar;
private final ServiceConnection mConnection = new ServiceConnection() {
    @Override
    public void onServiceConnected(ComponentName name, IBinder service) {
        Log.d(TAG, "onServiceConnected name : " + name);
        mICar = ICar.Stub.asInterface(service);
        try {
              mICar.registerCallback(mCallback);
            mICar.addListener(mICarListener);
        } catch (RemoteException e) {
            e.printStackTrace();
        }
    }
    @Override
    public void onServiceDisconnected(ComponentName name) {
        Log.d(TAG, "onServiceDisconnected: ");
        try {
            if (mICar != null) {
                mICar.removeListener(mICarListener);
            }
        } catch (RemoteException e) {
            throw new RuntimeException(e);
        }
        mICar = null;
    }
};
private final ICarListener mICarListener = new ICarListener.Stub() {
    @Override
    public void onCarStatus(int status) throws RemoteException {
        Log.d(TAG, "onCarStatus status : " + status);
    }
};

同一个进程

Intent intent = new Intent(this, CarService.class);
bindService(intent, mConnection, Context.BIND_AUTO_CREATE);

不同进程

AIDL那部分代码也要拷贝过去咯,略。

Intent intent = new Intent();
intent.setAction("com.biumall.musicservice.CAR_BIU_SERVICE");
intent.setPackage("com.biumall.musicservice");
bindService(intent, mConnection, Context.BIND_AUTO_CREATE);

同时需要在AndroidManifest.xml中新增如下配置

<queries>
    <package android:name="com.biumall.client" />
    <package android:name="com.biumall.musicservice" />
</queries>

参考文章

  1. Android R 使用aidl进行IPC跨进程通信失败,日志显示AppsFilter: interaction: PackageSetting ... BLOCKED

相关文章

自动化零件商城(www.rssme.com)专业PLC,变频器,直线模组,触摸屏,控制器,传感器等自动化商品网上购物商城,为广大中小工业企业提供优质、低价格和种类齐全的自动化零件。

暂无评论

评论审核已启用。您的评论可能需要一段时间后才能被显示。

none
暂无评论...