0

我想要什么:当互联网连接状态从关闭变为开启或反之亦然 - 即使应用程序未处于活动状态,我也想立即停止/启动服务。由于挂起的意图可能比调用应用程序的寿命更长,我认为这是可以实现的。

我正在尝试以这种方式使用ConnectivityManager.registerNetworkCallback重载版本PendingIntent

有一个广播接收器NetworkStatusReceiver应该接收与网络事件相关的意图:

class NetworkStatusReceiver : BroadcastReceiver() {
  override fun onReceive(context: Context, intent: Intent) {
    Toast.makeText(context, "something's changed", Toast.LENGTH_SHORT).show();
  }
}

在 AndroidManifest.xml 中注册接收器:

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

最后制作一个待处理的意图并将其注册为网络回调:

val builder = NetworkRequest.Builder()
builder.addTransportType(NetworkCapabilitties.TRANSPORT_CELLULAR)
builder.addTransportType(NetworkCapabilities.TRANSPORT_WIFI)
val networkRequest = builder.build()

val intent = Intent(context, NetworkStatusReceiver::class.java)
val pendingIntent = PendingIntent.getBroadcast(context, 0, intent, 0)

val connectivityManager = context.getSystemService(ConnectivityManager::class.java)
connectivityManager.registerNetworkCallback(networkRequest, pendingIntent)

问题

当互联网连接最初关闭时 -NetworkStatusReceiver当它变为 ON 时接收意图。即使应用程序已被杀死。好的,这样(OFF -> ON)它可以工作。但!当互联网连接在 的时刻处于活动状态时registerNetworkCallbackNetworkStatusReceiver立即接收到意图。我虽然只有在某些事情发生变化时才会调用回调。但在这种情况下,即使没有任何变化,它也会立即被调用。出于这个原因,我无法跟踪 ON -> OFF 事件。

任何想法,我做错了什么?即使这样,如何跟踪 ON -> OFF?似乎使用registerNetworkCallbackwithPendingIntent不是很流行,所以关于它的使用信息非常稀少。

4

1 回答 1

0

您是否只想知道何时有互联网连接?如果是这种情况,您无需担心传输类型,而是您拥有经过验证的支持 Internet 的网络可用。

对于互联网,您将使用NET_CAPABILITY_INTERNET和验证(无论此网络是否实际具有连接性),您将使用NET_CAPABILITY_VALIDATED.

然后,您会将您的请求更新为以下内容:

val builder = NetworkRequest.Builder()
builder.addTransportType(NetworkCapabilities.NET_CAPABILITY_INTERNET)
builder.addTransportType(NetworkCapabilities.NET_CAPABILITY_VALIDATED)
val networkRequest = builder.build()

NET_CAPABILITY_NOT_METERED如果您不想使用计量连接,您可能还需要包括在内。

于 2021-02-11T21:39:39.167 回答