Android跨应用通讯
Aapp 创建aidl文件
image.png
// IMyAidlInterface.aidl
package com.example.service;
// Declare any non-default types here with import statements
import com.example.service.AidlBean; //用到自定义对象的时候,需要引用对象的aidl文件
interface IMyAidlInterface {
String getData();
AidlBean getData2();
}
自定义对象为参数的时候需要先创建对应的aidl文件
// AidlBean.aidl
package com.example.bean; //java类所在的包
parcelable AidlBean; //序列化类名
自定义对象需要 实现Parcelable 接口,进行序列化
package com.example.bean;
import android.os.Parcel;
import android.os.Parcelable;
public class AidlBean implements Parcelable {
private String mData;
public AidlBean(String mData) {
this.mData = mData;
}
protected AidlBean(Parcel in) {
mData = in.readString();
}
public static final Creator<AidlBean> CREATOR = new Creator<AidlBean>() {
@Override
public AidlBean createFromParcel(Parcel in) {
return new AidlBean(in);
}
@Override
public AidlBean[] newArray(int size) {
return new AidlBean[size];
}
};
public String getmData() {
return mData;
}
public void setmData(String mData) {
this.mData = mData;
}
@Override
public int describeContents() {
return 0;
}
@Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeString(mData);
}
}
创建一个服务,供其他app监听此服务
package com.example.service.service;
import android.app.Service;
import android.content.Intent;
import android.os.IBinder;
import android.os.RemoteException;
import com.example.bean.AidlBean;
import com.example.service.IMyAidlInterface;
public class MyService extends Service {
public MyService() {
}
@Override
public IBinder onBind(Intent intent) {
return new Mybinder();
}
//创建一个类,继承aidl生成的类的。Stub ,生成此类,需要写完aidl文件后,buid一下生成
class Mybinder extends IMyAidlInterface.Stub{
@Override
public String getData() throws RemoteException {
return "服务端传过来的String";
}
@Override
public AidlBean getData2() throws RemoteException {
return new AidlBean("测试自定义对象数据");
}
}
}
为了能让别的app找到此服务
<service
android:name="com.example.service.service.MyService"
android:enabled="true"
android:exported="true">
<intent-filter>
<action android:name="com.example.myalidl_a.service"/>
<category android:name="android.intent.category.DEFAULT"/>
</intent-filter>
</service>
至此Aapp完毕
Bapp需要拥有和Aapp相同的 aidl文件,及绑定类,包名必须一致
监听服务
private void initServer() {
Intent intent = new Intent();
intent.setPackage("com.example.myalidl_a");
intent.setAction("com.example.myalidl_a.service");
bindService(intent, new ServiceConnection()
{
@Override
public void onServiceConnected(ComponentName name, IBinder service)
{
iMyAidlInterface = IMyAidlInterface.Stub.asInterface(service);
//通过 iMyAidlInterface 获取到传递的参数,及传递参数
}
@Override
public void onServiceDisconnected(ComponentName name)
{
}
}, BIND_AUTO_CREATE);
}
网友评论