为什么没有收到来自服务的本地广播?

Why isn't my local broadcast from a service being received?

我有一个包含服务 (WifiDirectFileTransferService) 和广播接收器 (WifiDirectBroadcastReceiver) 的应用程序。广播接收器用于接收全局广播(for WifiP2PManager.WIFI_P2P_..._ACTION)。这部分,接收全局广播,工作正常

然后我尝试设置相同的广播接收器来接收本地广播,RECEIVED_MESSAGE_DONE_ACTION。在我已经在 activity 中注册全球广播接收器的地方,我添加了本地注册:

@Override
protected void onResume() {
    super.onResume();
    // Register the broadcast receiver with the intent values to be matched.
    registerReceiver(mReceiver, mIntentFilter);
    // Register for local broadcasts too.
    Log.i(TAG, "onResume: registering local broadcast receiver " + mLocalIntentFilter.getAction(0));
    LocalBroadcastManager.getInstance(getApplicationContext())
          .registerReceiver(mReceiver, mLocalIntentFilter);
}

@Override
protected void onPause() {
    super.onPause();
    // Unregister the broadcast receiver.
    unregisterReceiver(mReceiver);
    Log.i(TAG, "onPause: unregistering local broadcast receiver " + mLocalIntentFilter.getAction(0));
    LocalBroadcastManager.getInstance(getApplicationContext())
          .unregisterReceiver(mReceiver);
}

日志消息确认广播接收器正在注册,而不是在广播发生之前取消注册。

本地intent过滤器是这样初始化的,在onCreate():

mLocalIntentFilter.addAction(WifiDirectBroadcastReceiver.RECEIVED_MESSAGE_DONE_ACTION);

本地广播由意图服务在onHandleIntent()期间发送:

Intent broadcastIntent = new Intent(RECEIVED_MESSAGE_DONE_ACTION)
     .putExtra(EXTRA_OTHER_DEVICE_ADDRESS, senderAddress.getHostAddress());

Log.i(TAG, "receiveMessage(): broadcasting " + broadcastIntent.toString());
LocalBroadcastManager.getInstance(getApplicationContext()).sendBroadcast(intent);

但是 BroadcastReceiver 的 onReceive() 从来没有被调用过这个广播 。 为什么不呢?

是否因为广播是从一个服务发送的?那应该没关系……本地广播应该在应用程序内运行,并且该服务在应用程序内。 (并且 确认服务可以向同一应用程序内的 activity 发送本地广播。)

是否因为同一个广播接收器被用于本地和全球广播?据我所知,这也不重要。事实上,我尝试了一个带有单独 BroadcastReceiver 的替代版本用于本地广播。行为保持不变:似乎没有收到本地广播。

此问题不是 的重复问题,其中的问题是本地广播接收器未使用 LocalBroadcastManager 注册。

更新:可以肯定的是,我现在使用 getApplicationContext() 作为 LocalBroadcastManager.getInstance() 的参数,以防在一种情况下是否传递 activity 上下文很重要,并且另一个应用程序上下文。这并没有解决问题。

更新 2

应 David 的要求,我将发布部分清单。

<uses-permission android:name="android.permission.INTERNET" />

<!-- For Wi-Fi direct (https://developer.android.com/training/connect-devices-wirelessly/wifi-direct.html#create-group) -->
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.CHANGE_NETWORK_STATE" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<!-- Do we need this for WiFi Direct? -->
<uses-permission android:name="android.permission.READ_PHONE_STATE" />

...

    <!-- The activity that registers the local broadcast. -->
    <activity android:name=".activity.ShareActivity"
              android:theme="@style/Theme.AppCompat.NoActionBar" />

    <!-- This is the service that sends the local broadcast. -->
    <service android:name=".comm.WifiDirectFileTransferService" />

如果你还有其他想看的部分,请告诉我。

找到了!谈大海捞针:-)

您写道:

Intent broadcastIntent = new Intent(RECEIVED_MESSAGE_DONE_ACTION)
 .putExtra(EXTRA_OTHER_DEVICE_ADDRESS, senderAddress.getHostAddress());

Log.i(TAG, "receiveMessage(): broadcasting " + broadcastIntent.toString());
LocalBroadcastManager.getInstance(getApplicationContext()).sendBroadcast(intent);

因此,您在变量 broadcastIntent 中构建并记录广播 Intent,但您调用 sendBroadcast() 并将变量 intent 作为参数传递!