android中aidl的简单使用

本文详细介绍AIDL(Android接口定义语言)的基本概念与实践步骤,包括如何在两个Android应用间建立通信,从定义接口、实现服务端到客户端的绑定过程。

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

aidl:android接口定义语言,能实现两个进程之间的通信

编写Aidl文件时,需要注意下面几点:  
  1.接口名和aidl文件名相同。 
  2.接口和方法前不用加访问权限修饰符public,private,protected等,也不能用final,static。 
  3.Aidl默认支持的类型包话java基本类型(int、long、boolean等)和(String、List、Map、CharSequence),使用这些类型时不需要import声明。对于List和Map中的元素类型必须是Aidl支持的类型。如果使用自定义类型作为参数或返回值,自定义类型必须实现Parcelable接口。 
  4.自定义类型和AIDL生成的其它接口类型在aidl描述文件中,应该显式import,即便在该类和定义的包在同一个包中。 
  5.在aidl文件中所有非Java基本类型参数必须加上in、out、inout标记,以指明参数是输入参数、输出参数还是输入输出参数。 
  6.Java原始类型默认的标记为in,不能为其它标记。 

在B应用中定义:(B应用必须先运行,不然会报空指针)

1、定义aidl时与定义接口方法相似,只是不能再前面加修饰符,在文件中写代码:

文件名IMusicPlay.aidl   (自定义)

package com.example.baidlservice;
interface IMusicPlay{
	void play(String path);
}
2、在service中实现接口

public class PlayService extends Service {

	private SerBinder serBinder = new SerBinder();
	private Handler mHander = new Handler();
	@Override
	public IBinder onBind(Intent intent) {
		return serBinder;
	}

	public class SerBinder extends IMusicPlay.Stub{    //<span style="color: rgb(51, 51, 51); font-family: Arial; font-size: 14px; line-height: 21.59375px;">Stub抽象类内部实现了aidl接口</span>

		@Override
		public void play(String path) throws RemoteException {
			mHander.post(new Runnable() {
				
				@Override
				public void run() {

					Toast.makeText(PlayService.this, "播放成功", Toast.LENGTH_SHORT).show();
				}
			});
		}
		
	}
}

3、注册

<application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <service android:name="com.example.baidlservice.PlayService">
            <intent-filter>
                <action android:name="com.example.PLAYSERVICE"/>    <!-- 其他应用隐式调用意图实现(此处为A应用)可以自定义 -->
            </intent-filter>
        </service>
    </application>
<span style="font-family:Arial, Helvetica, sans-serif;">
</span>
<span style="font-family:Arial, Helvetica, sans-serif;">此时将B应用定义好了,下面将包含aidl的包拷贝到A应用src下即可,系统会自动在A应用R文件下生成一个Java文件</span>

<span style="font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255);"><strong>在A应用中实现绑定service方法bindService()</strong>:(后运行)</span>

<span style="font-size:14px;">public class MainActivity extends Activity {

	private IMusicPlay mIMusicPlay;
	private Button mPlayBtn;
	private ServiceConnection conn = new ServiceConnection() {
		
		@Override
		public void onServiceDisconnected(ComponentName name) {
			mIMusicPlay = null;
		}
		
		@Override
		public void onServiceConnected(ComponentName name, IBinder service) {
			mIMusicPlay = IMusicPlay.Stub.asInterface(service);    //</span><span style="font-size:12px;">此处使用<span style="font-family: Arial, Helvetica, sans-serif;">asInterface转换实例</span></span><span style="font-size:14px;">

		}
	};
	
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		mPlayBtn = (Button) findViewById(R.id.button1);
		
		mPlayBtn.setOnClickListener(new OnClickListener() {
			
			@Override
			public void onClick(View v) {
				try {
					mIMusicPlay.play("file://xx.mp3");
				} catch (RemoteException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
				
			}
		});
		Intent service = new Intent("com.example.PLAYSERVICE");    //隐式调用
		bindService(service, conn, BIND_AUTO_CREATE);     //绑定service
	}

	@Override
	protected void onDestroy() {
		super.onDestroy();</span>
<span style="font-size:14px; font-family: Arial, Helvetica, sans-serif;">		</span><span style="font-size:14px;font-family: Arial, Helvetica, sans-serif;">		</span><span style="font-size:12px;font-family: Arial, Helvetica, sans-serif;">unbindService(conn);</span><span style="font-size:14px; font-family: Arial, Helvetica, sans-serif;">		</span>

<span style="font-size:14px;">	}
}</span>




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值