java - 如何将 registerNetworkCallback 与 PendingIntent 一起使用?

标签 java android kotlin

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/

相关文章:

kotlin - 是否有更优雅或更短的方法将列表元素转换为 int、递增它并将其转换回字符串?

kotlin 从 NavigationView header 获取 View

java - 如何将 CXF 用于带有附件的客户端 REST 帖子

java - 谁能解释一下如何用java读取文件。 -1是什么意思?我想读取的文件中没有任何数字..困惑 :(

java - DFS Java 实现 : how to write "Element in deque/stack"

java - 如何在java中生成20到100之间5个随机数的列表

Android:单击 EditText 时启动 Activity

java - Android:如何使用自签名证书和 SSL 缓存创建 HttpClient

java - 将 cookie 注入(inject) WebView 不起作用

java - Android espresso 在层次结构中找不到匹配的 View