为什么没有收到来自服务的本地广播?
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
作为参数传递!
我有一个包含服务 (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()
从来没有被调用过这个广播 。
为什么不呢?
是否因为广播是从一个服务发送的?那应该没关系……本地广播应该在应用程序内运行,并且该服务在应用程序内。 (并且
是否因为同一个广播接收器被用于本地和全球广播?据我所知,这也不重要。事实上,我尝试了一个带有单独 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
作为参数传递!