【发布时间】:2014-05-19 11:54:51
【问题描述】:
我询问了使用带有 ResultReceiver 的 BroadcastReceiver 的方式。
我知道如果“A BroadcastReceiver 没有在 10 秒内完成执行。”,就会出现 ANR。
我有一个响应 Intent 的应用程序,在 Manifest 中声明。 它是一个 BroadcastReceiver 启动一个服务,因为它需要进行一些网络操作:
public class MyReceiver extends BroadcastReceiver {
private Context context = null;
private MyResultReceiver myResultReceiver = null;
@Override
public void onReceive(Context context, Intent intent) {
this.context = context;
myResultReceiver = new MyResultReceiver(new Handler());
Intent i = new Intent();
i.setClass(context, MyService.class);
i.putExtra(Constants.EXTRA_RESULT_RECEIVER, myResultReceiver);
context.startService(i);
}
public class MyResultReceiver extends ResultReceiver {
public MyResultReceiver(Handler handler) {
super(handler);
}
@Override
protected void onReceiveResult(int resultCode, Bundle resultData) {
if (resultCode == 42) {
// Something
} else {
// Something else
}
}
}
}
我的服务如下所示:
public class MyService extends Service {
private Context context = null;
private ResultReceiver resultReceiver = null;
@Override
public IBinder onBind(Intent intent) {
// TODO Auto-generated method stub
return null;
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
this.context = this;
resultReceiver = intent.getParcelableExtra(Constants.EXTRA_RESULT_RECEIVER);
MyTask myTask = new MyTask();
myTask.execute();
return super.onStartCommand(intent, flags, startId);
}
public class MyTask extends AsyncTask<Void, Void, Boolean> {
@Override
protected Boolean doInBackground(Void... params) {
// Network operation
return status;
}
@Override
protected void onPostExecute(final Boolean status) {
Bundle bundle = new Bundle();
if (status == true) {
if (resultReceiver != null) {
resultReceiver.send(42, null);
}
} else {
if (resultReceiver != null) {
resultReceiver.send(-1, null);
}
}
}
}
}
我的问题是,如果网络操作超过 10 秒,我确定 resultReceiver 仍然存在并且会做它必须做的事情吗?
【问题讨论】:
标签: android android-intent broadcastreceiver android-service