android通讯同步 广告,Android实现组件之间同步的回调通信

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值