Activity与service的通信方法网上讲解的文章很多,大多都是介绍了通过广播和binder的方式 ,前些日子看大神博客才发现还有Messenger这个类也可以实现activity与service的通信.近日又发现了ResultReceiver这个类同样可以实现.下面我就通过一个Demo来介绍一下它的使用方式.
先来看看android开发者文档上ResultReceiver的介绍
渣渣英语就不给大家翻译了.大致的意思就是这是一个接收结果的通用回调接口,使用的是IPC通信方式.
下面直接上代码:
- 创建一个自己的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);
}
}
- 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();
}
}
}
}
- 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 + "");
}
}
来看一下效果图:
使用起来还是蛮简单的.