动态注册的广播接收器的 onReceive() 钩子方法没有被调用
Dynamically registered broadcast receiver's onReceive() hook method is not called
这是可选作业的一部分。我有一个 Activity 动态注册广播接收器并启动 IntentService。广播接收器应该在执行其工作后从 IntentService 接收意图。但是IntentService发送广播后,并没有调用onReceive
我正在记录输出,我收到的最后一条日志来自发送广播后的 IntentService。之后就不知道怎么继续调试了
请指教
我的代码有什么问题以至于没有调用 onReceive() 方法?
编辑:回答(来自 HeyAlex)
IntentService 正在通过 LocalBroadcastManager 发送广播,而由 Activity 启动的广播接收器未注册到 LocalBroadcastManager 实例,而是正常的动态注册。所以广播接收器没有接收到发送的广播。
DownloadAtomFeedService(扩展 IntentService)
@Override
public void onHandleIntent(Intent intent) {
List<Entry> entries = downloadAtomFeed(uri.toString());
int requestCode = intent.getExtras().getInt(REQUEST_CODE);
sendEntries((ArrayList<Entry>) entries,uri,requestCode);
Log.d(TAG, "onHandleIntent: returning to MainActivity");
}
private void sendEntries(ArrayList<Entry> entries,
Uri url,
int requestCode) {
Bundle bundle = makeReplyBundle(entries,url,requestCode);
Intent intent = new MainActivity().makeBroadcastReceiverIntent();
intent.putExtras(bundle);
LocalBroadcastManager.getInstance(getApplicationContext()).sendBroadcast(intent);
Log.d(TAG, "sendEntries: SENT BROADCAST");
}
private Bundle makeReplyBundle(ArrayList<Entry> entries,
Uri url,
int requestCode) {
Bundle data = new Bundle();
data.putParcelableArrayList(ENTRY_ARRAY_KEY,entries);
data.putInt(REQUEST_CODE,requestCode);
data.putString(FEED_URL,url.toString());
if(entries == null){
data.putInt(DOWNLOAD_RESULTS,Activity.RESULT_CANCELED);
}else data.putInt(DOWNLOAD_RESULTS,Activity.RESULT_OK);
return data;
}
主要Activity
@Override
protected void onResume() {
super.onResume();
IntentFilter intentFilter = new IntentFilter(DownloadStateReceiver.BROADCAST_ACTION);
DownloadStateReceiver mDownloadStateReceiver = new DownloadStateReceiver();
registerReceiver(mDownloadStateReceiver,intentFilter);
android.util.Log.d(TAG, "onResume: downloadstatereceiver registered");
}
@Override
protected void onPause() {
LocalBroadcastManager.getInstance(getApplicationContext()).unregisterReceiver(mDownloadStateReceiver);
super.onPause();
}
public static Intent makeBroadcastReceiverIntent() {
Intent intent = new Intent().setAction(DownloadStateReceiver.BROADCAST_ACTION);
return intent;
}
public class DownloadStateReceiver extends BroadcastReceiver {
public static final String BROADCAST_ACTION =
"myassignment.activities.BROADCAST";
public DownloadStateReceiver() {
android.util.Log.d(TAG, "DownloadStateReceiver: ");
}
public void onReceive(Context context, Intent intent) {
MainActivity.this.serviceIntentReceived(intent.getExtras());
android.util.Log.d(TAG, "onReceive: BroadcastReceived");
}
}
问题是您不是通过 LocalBroadcastManager 注册 BroadcastReceiver。只需将您的 onResume 设置为:
@Override
protected void onResume() {
super.onResume();
IntentFilter intentFilter = new IntentFilter(DownloadStateReceiver.BROADCAST_ACTION);
mDownloadStateReceiver = new DownloadStateReceiver();
LocalBroadcastManager.getInstance(this).registerReceiver(mDownloadStateReceiver,intentFilter);
android.util.Log.d(TAG, "onResume: downloadstatereceiver registered");
}
这是可选作业的一部分。我有一个 Activity 动态注册广播接收器并启动 IntentService。广播接收器应该在执行其工作后从 IntentService 接收意图。但是IntentService发送广播后,并没有调用onReceive
我正在记录输出,我收到的最后一条日志来自发送广播后的 IntentService。之后就不知道怎么继续调试了
请指教
我的代码有什么问题以至于没有调用 onReceive() 方法?
编辑:回答(来自 HeyAlex)
IntentService 正在通过 LocalBroadcastManager 发送广播,而由 Activity 启动的广播接收器未注册到 LocalBroadcastManager 实例,而是正常的动态注册。所以广播接收器没有接收到发送的广播。
DownloadAtomFeedService(扩展 IntentService)
@Override
public void onHandleIntent(Intent intent) {
List<Entry> entries = downloadAtomFeed(uri.toString());
int requestCode = intent.getExtras().getInt(REQUEST_CODE);
sendEntries((ArrayList<Entry>) entries,uri,requestCode);
Log.d(TAG, "onHandleIntent: returning to MainActivity");
}
private void sendEntries(ArrayList<Entry> entries,
Uri url,
int requestCode) {
Bundle bundle = makeReplyBundle(entries,url,requestCode);
Intent intent = new MainActivity().makeBroadcastReceiverIntent();
intent.putExtras(bundle);
LocalBroadcastManager.getInstance(getApplicationContext()).sendBroadcast(intent);
Log.d(TAG, "sendEntries: SENT BROADCAST");
}
private Bundle makeReplyBundle(ArrayList<Entry> entries,
Uri url,
int requestCode) {
Bundle data = new Bundle();
data.putParcelableArrayList(ENTRY_ARRAY_KEY,entries);
data.putInt(REQUEST_CODE,requestCode);
data.putString(FEED_URL,url.toString());
if(entries == null){
data.putInt(DOWNLOAD_RESULTS,Activity.RESULT_CANCELED);
}else data.putInt(DOWNLOAD_RESULTS,Activity.RESULT_OK);
return data;
}
主要Activity
@Override
protected void onResume() {
super.onResume();
IntentFilter intentFilter = new IntentFilter(DownloadStateReceiver.BROADCAST_ACTION);
DownloadStateReceiver mDownloadStateReceiver = new DownloadStateReceiver();
registerReceiver(mDownloadStateReceiver,intentFilter);
android.util.Log.d(TAG, "onResume: downloadstatereceiver registered");
}
@Override
protected void onPause() {
LocalBroadcastManager.getInstance(getApplicationContext()).unregisterReceiver(mDownloadStateReceiver);
super.onPause();
}
public static Intent makeBroadcastReceiverIntent() {
Intent intent = new Intent().setAction(DownloadStateReceiver.BROADCAST_ACTION);
return intent;
}
public class DownloadStateReceiver extends BroadcastReceiver {
public static final String BROADCAST_ACTION =
"myassignment.activities.BROADCAST";
public DownloadStateReceiver() {
android.util.Log.d(TAG, "DownloadStateReceiver: ");
}
public void onReceive(Context context, Intent intent) {
MainActivity.this.serviceIntentReceived(intent.getExtras());
android.util.Log.d(TAG, "onReceive: BroadcastReceived");
}
}
问题是您不是通过 LocalBroadcastManager 注册 BroadcastReceiver。只需将您的 onResume 设置为:
@Override
protected void onResume() {
super.onResume();
IntentFilter intentFilter = new IntentFilter(DownloadStateReceiver.BROADCAST_ACTION);
mDownloadStateReceiver = new DownloadStateReceiver();
LocalBroadcastManager.getInstance(this).registerReceiver(mDownloadStateReceiver,intentFilter);
android.util.Log.d(TAG, "onResume: downloadstatereceiver registered");
}