AIDL进程间通信

AIDL:进程间的通讯(一个APP与另一个APP交互)

本例子以一个App作为支付应用,另一个App调用支付APP内的支付方法,以此实现进程间的通信。

效果图如下:

第一种是启动支付APP后再调用,第二种时未启动APP直接调用。虽然第二种调用没有和用户交互,支付APP内部的方法其实是已经实现了,可以冲Log看出。

    

第一种方式打印log如下:

打开支付调用APP打印出日志,表示已经和支付APP建立通讯连接

01-15 10:50:43.498 3087-3087/com.leixiansheng.test2 E/MainActivity: onServiceConnected

点击支付后,支付APP打印日志,表示已经被其他应用调用内部方式

01-15 10:52:29.325 2903-2920/com.leixiansheng.test E/PayService: 支付成功

第二种方式打印log如下:

打开支付调用APP打印出日志,表示已经和支付APP建立通讯连接

01-15 10:50:43.498 3087-3087/com.leixiansheng.test2 E/MainActivity: onServiceConnected

点击支付后,支付APP打印日志,表示已经被其他应用调用内部方式

01-15 10:52:29.325 2903-2920/com.leixiansheng.test E/PayService: 支付成功

可以看出,第二种方式虽然未启动支付APP,但是打印的日志和第一种是一样的,说明在支付APP未运行,依旧可以进行通讯。

好了,效果图和日志都讲解清楚了。现在我们来看看如何在android studio下实现AIDL进程通讯

一、支付APP下

1、新建PayService继承Service。在app右键新建AIDL->PayAidlInterface.aidl

// PayAidlInterface.aidl
package com.leixiansheng.test;

// Declare any non-default types here with import statements

interface PayAidlInterface {

  void pay();
}

2、新建成功后,再Build->Make Modle app ,使系统生成对应的AIDL系统文件(注意这步不能省略)

3、然后去实现PayService中的内容,新建内部类继承Stub(这个类就是AIDL make 后自动生成的类),将这个内部类作为IBinder返回

class PayBind extends PayAidlInterface.Stub{

		@Override
		public void pay() throws RemoteException {
			PayService.this.pay();	//本类的pay()方法
		}
	}

4、最后去清单文件静态注册PayService

<service android:name=".PayService">
            <intent-filter>
                <action android:name="com.leixiansheng.pay"/>
            </intent-filter>
        </service>

到此处,支付APP功能就做完了

二、调用支付APP

1、和“一”一样,去新建AIDL(注意,这里的AIDL包名要修改成和“一”中的包名一直,然后将“一”中的PayAidlInterface.aidl复制过来),然后老规矩 Make 一下

2、动态绑定好Service于 支付APP建立连接

3、在需要的地方调用 PayAidlInterface 内的方法即可

到此完结

支付APP代码如下:

1、新建PayService继承Service。在app右键新建AIDL->PayAidlInterface.aidl

2、新建成功后,再Build->Make Modle app ,使系统生成对应的AIDL系统文件(注意这步不能省略)

3、然后去实现PayService中的内容,新建内部类继承Stub(这个类就是AIDL make 后自动生成的类),将这个内部类作为IBinder返回

interface PayAidlInterface {

  void pay();
}
public class PayService extends Service {

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

	class PayBind extends PayAidlInterface.Stub{

		@Override
		public void pay() throws RemoteException {
			PayService.this.pay();	//本类的pay()方法
		}
	}

	private void pay() {
		EventBus.getDefault().post(new PayEvent());
		Log.e("PayService", "支付成功");
	}
}

4、最后去清单文件静态注册PayService

<service android:name=".PayService">
            <intent-filter>
                <action android:name="com.leixiansheng.pay"/>
            </intent-filter>
        </service>

调用支付APP代码如下:

1、和“一”一样,去新建AIDL(注意,这里的AIDL包名要修改成和“一”中的包名一直,然后将“一”中的PayAidlInterface.aidl复制过来),然后老规矩 Make 一下

interface PayAidlInterface {

  void pay();
}

2、动态绑定好Service于 支付APP建立连接

3、在需要的地方调用 PayAidlInterface 内的方法即可

public class MainActivity extends AppCompatActivity {

	Button mPay;

	private PayAidlInterface mPayAidlInterface;    //接口对象

	private ServiceConnection mServiceConnection = new ServiceConnection() {
		@Override
		public void onServiceConnected(ComponentName name, IBinder service) {
			Log.e("MainActivity", "onServiceConnected");

			mPayAidlInterface = PayAidlInterface.Stub.asInterface(service);//获取到通讯对象
		}

		@Override
		public void onServiceDisconnected(ComponentName name) {

		}
	};

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

		mPay = findViewById(R.id.doThing);

		Intent intent = new Intent();
		//5.0以上必须这样设置
		intent.setPackage("com.leixiansheng.test");
		intent.setAction("com.leixiansheng.pay");

        //绑定建立连接
		bindService(intent,mServiceConnection, BIND_AUTO_CREATE);

		mPay.setOnClickListener(new View.OnClickListener() {
			@Override
			public void onClick(View v) {
				try {
					if (mPayAidlInterface != null) {
						mPayAidlInterface.pay();
//						Toast.makeText(getApplicationContext(), "支付成功", Toast.LENGTH_SHORT).show();
					} else {
						Log.e("MainActivity", "null");
					}
				} catch (RemoteException e) {
					e.printStackTrace();
				}

			}
		});
	}

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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
AIDL(Android Interface Definition Language)是Android中用于进程间通信(IPC)的一种机制。它允许不的应用程序或在不同的进程进行通信。下面是对AIDL进程间通信的详细讲解: 1. 定义接口:首先,你需要创建一个AIDL接口,该接口包含用于进程间通信的方法和数据类型。AIDL接口文件通常以`.aidl`为后缀名,放置在`src/main/aidl`目录中。在接口中定义的方法参数和返回值只能使用支持的数据类型、其他AIDL接口或Parcelable对象。 2. 实现接口:在服务端应用程序中,你需要实现AIDL接口。实现类需要继承自AIDL接口生成的抽象类,并实现其中的方法。这些方法将用于处理客户端发起的远程调用请求。 3. 注册接口:在服务端应用程序的`AndroidManifest.xml`文件中,使用`<service>`标签注册你的服务,并通过`android:process`属性指定所在的进程。确保在`<intent-filter>`标签中包含正确的action,使得客户端能够找到并与你的服务进行绑定。 4. 创建客户端:在客户端应用程序中,你需要绑定到服务端应用程序中的服务。使用`ServiceConnection`接口来管理与服务的连接和断开连接。当连接成功后,你可以通过AIDL接口提供的方法与服务进行通信。 5. 调用方法:在客户端与服务端建立连接后,你可以通过AIDL接口提供的方法调用服务端的功能。这些方法调用将跨越进程边界执行,并将结果返回给客户端。 6. 处理并发:在处理AIDL进程间通信时,需要注意并发性和线程安全性。多个客户端可能同时访问服务端,因此需要合理地处理并发情况,以保证数据的一致性和安全性。 总结来说,AIDL进程间通信是通过定义接口、实现接口、注册接口、创建客户端和调用方法来实现的。这种机制允许不同进程的应用程序之间进行通信,并共享数据和功能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值