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>