java - 如何将 registerNetworkCallback 与 PendingIntent 一起使用?
问题描述
CONNECTIVITY_ACTION在 API 级别 28 中已弃用,Google 建议使用 registerNetworkCallback(NetworkRequest, PendingIntent)。
我尝试使用ConnectivityManager.NetworkCallback进行 registerNetworkCallback并且它有效,但我想使用 PendingIntent。
让我困惑的是public void registerNetworkCallback(NetworkRequest request, PendingIntent operation)的描述:
该操作是一个 Intent 广播,它发送到您使用 Context#registerReceiver 或通过 AndroidManifest.xml 文件中的标记注册的广播接收器
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
吗?但是IntentFilter
如果CONNECTIVITY_ACTION
不推荐使用,我应该使用什么操作?
解决方案
最后我让它工作了。首先我需要将接收器添加到 AndroidManifest.xml
<receiver
android:name=".NetworkStateReceiver"
android:enabled="true"
android:exported="true" />
其次,NetworkStateReceiver#onReceive
仅在连接脱机并可用时调用一次。因此,每当我需要在连接离线时发送任何内容时,我都必须调用registerNetworkUpdates
.
第三,我必须先打电话unregisterNetworkCallback
,然后再打电话registerNetworkCallback
。如果我registerNetworkCallback
用相同的方法调用了两次Intent
,NetworkStateReceiver#onReceive
则被调用了两次。我在创建时使用applicationContext
而不是。this
PendingIntent.getBroadcast
推荐阅读
- vue.js - i18n vue 在更改语言环境时不起作用,使用 vuetify 文本字段中的规则
- c# - 如何通过 C# 访问嵌套标签?
- java - Runnable 没有捕获到异常
- c# - 剑道组合框需要验证不起作用
- javascript - 我怎样才能将盒子移动到拐角处
- reactjs - 在带有路由的 github 页面上部署 Reactjs 网站会导致刷新时出现 404 错误
- javascript - 如何在 ReactJS 中隐藏/显示另一个组件内的组件
- elasticsearch - 文档数量相同,但每次运行 logstash 时索引大小都在增长
- android - 上传 .aab 文件后,它没有显示基于移动架构的应用程序大小
- inno-setup - 将版本添加到 Inno Setup 的 SetupWindowTitle