首页 > 解决方案 > 如何将 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不推荐使用,我应该使用什么操作?

标签: javaandroidkotlin

解决方案


最后我让它工作了。首先我需要将接收器添加到 AndroidManifest.xml

<receiver 
        android:name=".NetworkStateReceiver"
        android:enabled="true"
        android:exported="true" />

其次,NetworkStateReceiver#onReceive仅在连接脱机并可用时调用一次。因此,每当我需要在连接离线时发送任何内容时,我都必须调用registerNetworkUpdates.

第三,我必须先打电话unregisterNetworkCallback,然后再打电话registerNetworkCallback。如果我registerNetworkCallback用相同的方法调用了两次IntentNetworkStateReceiver#onReceive则被调用了两次。我在创建时使用applicationContext而不是。thisPendingIntent.getBroadcast


推荐阅读