CONNECTIVITY_ACTION在 API 级别 28 中已弃用,Google 建议使用 registerNetworkCallback(NetworkRequest, PendingIntent)。
我尝试使用 ConnectivityManager.NetworkCallback 注册网络回调它有效,但我想使用 PendingIntent。
令我困惑的是 public void registerNetworkCallback(NetworkRequest request, PendingIntent operation) 的描述:
The operation is an Intent broadcast that goes to a broadcast receiver that you registered with Context#registerReceiver or through the tag in an AndroidManifest.xml file
Context#registerReceiver
接受 IntentFilter
作为参数,而 PendingIntent.getBroadcast
需要 Intent
。
这是我的代码,并且 NetworkStateReceiver::onReceive 未被调用。
private fun getNetworkIntent(): PendingIntent {
if (networkPendingIntent != null) {
return networkPendingIntent!!
}
val intent = Intent(this, NetworkStateReceiver::class.java)
networkPendingIntent = PendingIntent.getBroadcast(
this, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT)
return networkPendingIntent!!
}
private fun getNetworkRequest(): NetworkRequest {
return NetworkRequest.Builder()
.addTransportType(NetworkCapabilities.TRANSPORT_CELLULAR)
.addTransportType(NetworkCapabilities.TRANSPORT_WIFI)
.build()
}
private fun registerNetworkUpdates() {
var cm =
applicationContext.getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager?
cm?.registerNetworkCallback(getNetworkRequest(), getNetworkIntent())
}
为什么?
我还应该调用 Context#registerReceiver 吗?但是,如果 CONNECTIVITY_ACTION
已弃用,我应该对 IntentFilter
使用什么操作?
最佳答案
终于我成功了。首先,我需要将接收器添加到 AndroidManifest.xml
<receiver
android:name=".NetworkStateReceiver"
android:enabled="true"
android:exported="true" />
其次,NetworkStateReceiver#onReceive
仅在连接离线且可用时调用一次。因此,每次我需要在连接离线时发送任何内容时,我都必须调用 registerNetworkUpdates
。
第三,我必须在调用registerNetworkCallback
之前调用unregisterNetworkCallback
。如果我使用相同的 Intent
调用 registerNetworkCallback
两次,则 NetworkStateReceiver#onReceive
会被调用两次。在创建 PendingIntent.getBroadcast
时,我使用了 applicationContext
而不是 this
。
关于java - 如何将 registerNetworkCallback 与 PendingIntent 一起使用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58588132/