我有关于使用带有ResultReceiver的BroadcastReceiver的方法的询问。
我知道如果“一个BroadcastReceiver还没有在10秒内完成执行。”,就会有一个ANR。
我有一个应用程序响应在Manifest中声明的Intent。 它是一个启动服务的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);
}
}
}
}
}
我的问题是,我确定resultReceiver仍然存在,如果网络操作超过10秒,它会做它必须做的事情吗?
答案 0 :(得分:0)
以下是SDK中的relevant documentation:
如果此BroadcastReceiver是通过标签启动的话 从此函数返回后,该对象不再存在。这个 表示您不应执行任何返回结果的操作 你是异步的 - 特别是与服务交互, 你应该使用startService(Intent)而不是bindService(Intent, ServiceConnection,int)。如果您希望与服务进行交互 已经在运行,你可以使用peekService(Context,Intent)。
registerReceiver中使用的Intent过滤器(BroadcastReceiver, IntentFilter)和应用程序清单不保证是 独家。它们是操作系统有关如何查找的提示 合适的接收者。发件人可以强制交付 特定收件人,绕过筛选器解析。为此原因, onReceive()实现应该只响应已知的动作, 忽略他们可能收到的任何意外意图。
底线:
startService(Intent)
。onReceive
上执行长时间运行的应用程序。