Android AIDL原理

本文详细介绍了Android接口定义语言(AIDL)的用途与实现过程,通过实例展示了如何在两个Android应用间实现进程间通信。重点阐述了如何在不同应用间共享服务,以及使用AIDL文件、Service、AndroidManifest.xml等关键组件来完成这一目标。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

AIDL: Android Interface Define Language,Android接口定义语言

主要作用:可以用来定义进程间的通信接口


具体来讲,如果项目 B 想要访问项目 A 中的一些数据

1)在 项目 A 中创建好AIDL文件,在它里面定义好相关的接口:

package com.aidy.a.aidlservice;

interface RemoteService {

	String doSomething();

}

2)再定义一个Service,在Service中创建要给内部类继承于RemoteService.Stub

public class AService extends Service {

	@Override
	public IBinder onBind(Intent arg0) {
		// TODO Auto-generated method stub
		return new AIBinder();
	}

	public class AIBinder extends RemoteService.Stub {

		@Override
		public String doSomething() throws RemoteException {
			// TODO Auto-generated method stub
			return "test do something...";
		}

	}

}

同时在AndroidMenifest.xml中进行声明:

        <service android:name="com.aidy.a.AService" >
            <intent-filter>
                <action android:name="com.aidy.a.aidlservice.RemoteService" />
            </intent-filter>
        </service>
上述Action: com.aidy.a.aidlservice.RemoteService就是进程之间可以进行通信的一个契约ID

那么在 A 项目中我们想要使用该Service可以:

public class AMainActivity extends Activity {

	private AIBinder aIBinder = null;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		
		Intent intent = new Intent("com.aidy.a.aidlservice.RemoteService");
		this.bindService(intent, new AServiceConnection(), Service.BIND_AUTO_CREATE);
		
		((Button) findViewById(R.id.button)).setOnClickListener(new OnClickListener() {

			@Override
			public void onClick(View v) {
				// TODO Auto-generated method stub
				try {
					Toast.makeText(AMainActivity.this, aIBinder.doSomething(), Toast.LENGTH_SHORT).show();
				} catch (RemoteException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}

			}
		});
	}

	private final class AServiceConnection implements ServiceConnection {

		@Override
		public void onServiceConnected(ComponentName name, IBinder service) {
			// TODO Auto-generated method stub
			aIBinder = (AIBinder) service;
		}

		@Override
		public void onServiceDisconnected(ComponentName name) {
			// TODO Auto-generated method stub
			aIBinder = null;
		}

	}

}
工程 A 的目录结构:


现在有一个工程 B 想要与 A 进行通信:

1)将 A 当中的RemoteService.aidl文件拷贝到 B 当中来(保持RemoteService.aidl的包名不变)

调用如下:

public class BMainActivity extends Activity {

	private RemoteService remoteService = null;

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

		Intent intent = new Intent("com.aidy.a.aidlservice.RemoteService");
		this.bindService(intent, new BServiceConnection(), Service.BIND_AUTO_CREATE);</span>

		((Button) findViewById(R.id.button)).setOnClickListener(new OnClickListener() {

			@Override
			public void onClick(View v) {
				// TODO Auto-generated method stub
				try {
				Toast.makeText(BMainActivity.this, remoteService.doSomething(), Toast.LENGTH_SHORT).show();
				} catch (RemoteException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}

			}
		});
	}

	private final class BServiceConnection implements ServiceConnection {

		@Override
		public void onServiceConnected(ComponentName name, IBinder service) {
			// TODO Auto-generated method stub
			remoteService = RemoteService.Stub.asInterface(service);</span>
		}

		@Override
		public void onServiceDisconnected(ComponentName name) {
			// TODO Auto-generated method stub
			remoteService = null;
		}

	}

}


B 的目录结构:

在B中点击按钮就会执行对应的doSomething()操作





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值