aidl的学习(1)aidl中java.lang.RuntimeException: Didn‘t create service “XXX“

1、build中版本号为30及以上时,aidl无效,解决方案

①在客户端的manifest.xml中添加一下代码,其中代码中的包名为服务端的包名

<manifest>
...
<application>
....
 </application>
<queries >
    <package android:name="com.example.clientapplication"/>
   <intent>
       <action android:name="android.intent.action.MService"/>
   </intent>
</queries>
</manifest>

②修改build中的版本号

在这里插入图片描述

2、打开aidl中服务端的服务service出现闪退的问题

Caused by: 
java.lang.RuntimeException: Didn't create service "XXX" on path:
DexPathList[[zip file "/data/app/com.chemao.certification-2/base.apk"],
nativeLibraryDirectories=[/data/app/com.chemao.certification-2/lib/arm, /vendor/lib, /system/lib]]                                                     

方法:service的位置放错了,service应该放在java目录下。

aidl中服务端的目录结果如下所示:

在这里插入图片描述

3、跨进程通信aidl最简单的方法

①服务端

(1)AS切换模式为project,对main右键创建aidl文件,如下图:

在这里插入图片描述

(2)在创建的文件中定义想实现的接口

在这里插入图片描述

(3)build projection

如果rebuild出现问题的话,可以先clean projection

在这里插入图片描述

(4)创建类继承service,在service中创建内部类实现aidl中定义的接口数据,在java目录下创建,不要在aidl中进行创建,不然后续会出现问题。

在这里插入图片描述

public class MService extends Service {

	private IAidlInterface mBinder;
	@Nullable
	@Override
	public IBinder onBind(Intent intent) {
		Log.d("TAG", "onBind: " + intent);
		return mBinder.asBinder();
	}

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

	private class Binder extends IAidlInterface.Stub{

		private static final String TAG = "mBinder";
		@Override
		public void basicTypes() throws RemoteException {
			Log.d(TAG, "basicTypes: " + "我是服务端数据信息");
		}
	}
}

(5)在manifest中定义service,不然service无作用,在定义service中,可以声明action进行隐式调用

在这里插入图片描述

到此为止,服务端的工作完成

②客户端

(1)在manifest中进行安全防护

在这里插入图片描述

②将服务端中aidl复制过来,和服务端一模一样,进行rebuild即可。

在这里插入图片描述

(3)在activity中进行服务的绑定,bindservice返回值为true,onServiceConnected中有打印,就知道服务成功。

public class MainActivity extends AppCompatActivity {
	private IAidlInterface mIExtraAidlInterface;
	private ServiceConnection mServiceConn;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		Button button = findViewById(R.id.name);

	//	bindService();

		mServiceConn = new ServiceConnection() {
			@Override
			public void onServiceConnected(ComponentName name, IBinder service) {
				mIExtraAidlInterface = IAidlInterface.Stub.asInterface(service);
				try {
					mIExtraAidlInterface.basicTypes();
				} catch (RemoteException e) {
					throw new RuntimeException(e);
				}
				Log.d(TAG, "onServiceConnected: ");
			}
			@Override
			public void onServiceDisconnected(ComponentName name) {
				//	mIExtraAidlInterface = null;
				Toast.makeText(MainActivity.this, "0000", Toast.LENGTH_SHORT).show();
				Log.d(TAG, "onServiceDisconnected: ");
			}
		};
		bindService();
	}

	private void bindService(){
		Intent intent = new Intent();
		intent.setAction("android.intent.action.MService");
		intent.setPackage("com.example.clientapplication");
		ResolveInfo resolveInfo = getPackageManager().resolveService(intent, 0);
		Log.d(TAG, "bindService: " + resolveInfo);
		bindService(intent, mServiceConn, BIND_AUTO_CREATE);
		Log.d(TAG, "mServiceConn: " + mServiceConn);
		}

	@Override
	public boolean bindService(Intent service, ServiceConnection conn, int flags) {
		Log.d(TAG, "bindService: service " + service + "conn " + conn + "flags  " + flags);
		Log.d(TAG, "bindService: " + super.bindService(service,conn,flags));
		return super.bindService(service, conn, flags);

	}

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

对于aidl的具体说明,及复杂类型或者回调数据的使用,可见https://developer.android.google.cn/guide/components/aidl?hl=zh_cn