文章目录
在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>
参考文章
《