如何使用带有PendingIntent的registerNetworkCallback?

4

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?但是如果CONNECTIVITY_ACTION已被弃用,那我应该使用什么IntentFilter呢?
1个回答

2

最终我做到了。首先,我需要将接收器添加到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

1
一旦我使用PendingIntent注册了这样的回调函数,即使网络没有改变,接收器也会立即收到它。你如何让它只在网络改变时才起作用? - Alexey

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接