Android开发中,有时会遇到组件之间相互通信回调的问题。一般都是通过Android提供的ResultReceiver来实现(ResultReceiver的使用方法很简单,这里就不多提了)。
但之前在工作中,遇到了一个组件间回调的问题,ResultReceiver无法满足需求。简单描述一下问题:service中打开了一个activity,activity需要将一个变量值回调给service,而且这个回调必须是同步的。也就是说activity在确认service接收到了这个变量值后,才能继续向下执行代码。众所周知ResultReceiver的send方法是异步的,send方法执行后,接收方可能还没有收到消息。这样"不及时"的回调在我的项目中可能会造成状态不同步。
那么,只能自己实现一个同步的回调通信。
同步的回调通信代码如下:
github地址:https://github.com/yuhaiyang89/yhy-utils
1.定义一个AIDL
packagecom.yhy.utils;interfaceIChannel {void send(intcode, in Bundle data);
}
2.定义一个类,实现Parcelable(实现Parcelable是为了能让该类在组件中传递),并在此类中实现第一步定义的AIDL(通过这个AIDL完成回调)
packagecom.yhy.utils.demo;importandroid.os.Bundle;importandroid.os.Parcel;importandroid.os.Parcelable;importandroid.util.Log;importcom.yhy.utils.IChannel;public class SyncResultReceiver implementsParcelable {public static final Parcelable.Creator CREATOR = new Parcelable.Creator() {publicSyncResultReceiver createFromParcel(Parcel in) {return newSyncResultReceiver(in);
}public SyncResultReceiver[] newArray(intsize) {return newSyncResultReceiver[size];
}
};//是本地回调还是远程回调
final booleanmLocal;
IChannel mBridge;publicSyncResultReceiver() {
mLocal= true;
}
SyncResultReceiver(Parcel in) {
mLocal= false;
mBridge=IChannel.Stub.asInterface(in.readStrongBinder());
}public void send(intcode, Bundle data) {if(mLocal) {
onReceiveResult(code, data);return;
}if (mBridge != null) {try{
mBridge.send(code, data);
}catch(Exception e) {
Log.e("", "",e);
}
}
}protected void onReceiveResult(intcode, Bundle bundle) {//等待子类去实现此方法,接收消息
}public intdescribeContents() {return 0;
}public void writeToParcel(Parcel out, intflags) {synchronized (this) {if (mBridge == null) {
mBridge= newMyChannel();
}
out.writeStrongBinder(mBridge.asBinder());
}
}class MyChannel extendsIChannel.Stub {public void send(intcode, Bundle data) {
onReceiveResult(code, data);
}
}
}
实现完毕!
下面就可以使用SyncResultReceiver来实现同步回调了
例:MainActivity中打开Activity2,Activity2将一些消息同步的回调给MainActivity
MainActivity代码:
packagecom.yhy.utils.demo;importandroid.content.Intent;importandroid.support.v7.app.AppCompatActivity;importandroid.os.Bundle;importandroid.util.Log;public class MainActivity extendsAppCompatActivity {private int value = 0;
@Overrideprotected voidonCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);//重写SyncResultReceiver的onReceiveResult方法接收返回值
SyncResultReceiver mResultReceiver = newSyncResultReceiver(){
@Overrideprotected void onReceiveResult(intcode, Bundle bundle) {
value= bundle.getInt("value");
Log.d("TEST", "code=" + code + " | value = " +value);
}
};//开启Activity2
Intent intent = new Intent(this, Activity2.class);
intent.putExtra("callback", mResultReceiver);
startActivity(intent);
}
}
Activity2代码:
packagecom.yhy.utils.demo;importandroid.support.v7.app.AppCompatActivity;importandroid.os.Bundle;public class Activity2 extendsAppCompatActivity {
SyncResultReceiver mReceiver= null;
@Overrideprotected voidonCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);
mReceiver= getIntent().getParcelableExtra("callback");//给MainActivity回调值
Bundle bundle = newBundle();
bundle.putInt("value", 1);
mReceiver.send(1, bundle);
}
@Overrideprotected voidonStart() {super.onStart();//给MainActivity回调值
Bundle bundle = newBundle();
bundle.putInt("value", 2);
mReceiver.send(1, bundle);
}
@Overrideprotected voidonDestroy() {//给MainActivity回调值
Bundle bundle = newBundle();
bundle.putInt("value", 3);
mReceiver.send(1, bundle);super.onDestroy();
}
}
LOG输出:
03-03 11:50:28.780 2790-2790/? D/TEST: code=1 | value = 1
03-03 11:50:28.782 2790-2790/? D/TEST: code=1 | value = 2
03-03 11:53:07.588 2790-2790/? D/TEST: code=1 | value = 3
原文:http://www.cnblogs.com/younghome/p/6804399.html