繁体   English   中英

动态注册的广播接收器的 onReceive() 钩子方法没有被调用

[英]Dynamically registered broadcast receiver's onReceive() hook method is not called

这是可选作业的一部分。 我有一个动态注册广播接收器并启动 IntentService 的活动。 广播接收器应该在执行其工作后从 IntentService 接收意图。 但是,在 IntentService 发送广播后,并没有调用 onReceive。

我正在记录输出,我收到的最后一个日志来自 IntentService 发送广播后。 之后,我不知道如何继续调试。

请指教。

我的代码有什么问题以至于没有调用 onReceive() 方法?


编辑:答案(来自 HeyAlex)

IntentService 通过 LocalBroadcastManager 发送广播,而由 Activity 启动的广播接收器没有注册到 LocalBroadcastManager 实例,而是正常的动态注册。 所以广播接收器没有接收到发送的广播。


下载AtomFeedService(扩展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;
}

主要活动

@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");
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM