Activity与Service通信之ResultReceiver

Activity与service的通信方法网上讲解的文章很多,大多都是介绍了通过广播和binder的方式 ,前些日子看大神博客才发现还有Messenger这个类也可以实现activity与service的通信.近日又发现了ResultReceiver这个类同样可以实现.下面我就通过一个Demo来介绍一下它的使用方式.

先来看看android开发者文档上ResultReceiver的介绍

这里写图片描述

渣渣英语就不给大家翻译了.大致的意思就是这是一个接收结果的通用回调接口,使用的是IPC通信方式.

下面直接上代码:

  1. 创建一个自己的ResultReceiver并重写onReceiveResult方法交给自己的接口处理.
public class MyResultReceiver extends ResultReceiver {
    private Receiver mReceiver;


    /**
     * Create a new ResultReceive to receive results.  Your
     * {@link #onReceiveResult} method will be called from the thread running
     * <var>handler</var> if given, or from an arbitrary thread if null.
     *
     * @param handler
     */
    public MyResultReceiver(Handler handler) {
        super(handler);
    }

    @Override
    protected void onReceiveResult(int resultCode, Bundle resultData) {
        if(mReceiver != null){
            mReceiver.onReceiveResult(resultCode, resultData);
        }
    }

    public void setReceiver(Receiver receiver) {
        this.mReceiver = receiver;
    }

    public interface Receiver {
        void onReceiveResult(int resultCode, Bundle resultData);
    }
}
  1. service的代码,模拟下载
public class DownLoadIntentService extends IntentService {
    private static final String ACTION_DOWNLOAD = "download";

    private static final String EXTRA_PARAM1 = "receiver";

    private ResultReceiver mResultReceiver;


    public static void startDownLoad(Context context, MyResultReceiver param1) {
        Intent intent = new Intent(context, DownLoadIntentService.class);
        intent.setAction(ACTION_DOWNLOAD);
        //MyResultReceiver继承自Parcelable所以可以被放进intent参数中
        intent.putExtra(EXTRA_PARAM1, param1);
        context.startService(intent);
    }


    public DownLoadIntentService() {
        super("DownLoadIntentService");
    }

    @Override
    protected void onHandleIntent(Intent intent) {
        if (intent != null) {
            final String action = intent.getAction();
            if (ACTION_DOWNLOAD.equals(action)) {
                mResultReceiver = intent.getParcelableExtra(EXTRA_PARAM1);
                handleActionDownLoad();
            }
        }
    }

    private void handleActionDownLoad() {
        int i = 0;
        Bundle bundle = new Bundle();
        while (i++ <= 100) {
            bundle.putInt("progress", i);
            //每隔一秒发送一次下载进度
            mResultReceiver.send(0, bundle);
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
}
  1. Activity实现MyResultReceiver.Receiver接口,并注册到MyResultReceiver中.
public class MainActivity extends ActionBarActivity implements MyResultReceiver.Receiver {
    private TextView mTvProgress;
    private Button mButtonStart;

    //MyResultReceiver实例变量
    private MyResultReceiver mMyResultReceiver;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        mTvProgress = (TextView) findViewById(R.id.tv_progress);
        mButtonStart = (Button) findViewById(R.id.btn_start);

        mMyResultReceiver = new MyResultReceiver(new Handler());
        //创建一个MyResultReceiver并传入一个Handler参数.
    }

    @Override
    protected void onResume() {
        super.onResume();
        mMyResultReceiver.setReceiver(this);
        //注册自己到MyResultReceiver中.
    }

    @Override
    protected void onPause() {
        super.onPause();
        mMyResultReceiver.setReceiver(null);
        //取消注册,防止内存泄露
    }

    public void startService(View view){

        //开启服务的helper方法
        DownLoadIntentService.startDownLoad(this, mMyResultReceiver);
    }

    //接收数据的回调接口
    @Override
    public void onReceiveResult(int resultCode, Bundle resultData) {
        //从resultData参数中取出下载进度并更新view
        int progress = resultData.getInt("progress");
        mTvProgress.setText(progress + "");
    }
}

来看一下效果图:
这里写图片描述

使用起来还是蛮简单的.

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值