如何在 PendingIntent 不再可用时正确调用 releaseNetworkRequest(PendingIntent)

How to properly call releaseNetworkRequest(PendingIntent) when PendingIntent is no longer available

我正在尝试请求网络,因此我构建了 NetworkRequest 并构建了 PendingIntent,

ConnectivityManager conn_manager =  (ConnectivityManager)getSystemService(Context.CONNECTIVITY_SERVICE);

        NetworkRequest net_req;
        net_req = new NetworkRequest.Builder()
                .addTransportType(NetworkCapabilities.TRANSPORT_CELLULAR)  //Data Network?
                .addTransportType(NetworkCapabilities.TRANSPORT_WIFI)  //Wifi
                .addCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET)  //This might be what need internet permission
                .addCapability(NetworkCapabilities.NET_CAPABILITY_MMS)
                .build();

        Intent intent_sent = new Intent(activity, Service_MmsNetworkAvailable.class);

        PendingIntent pending_intent_net_req_received = PendingIntent.getService(activity, 0, intent_sent,
                PendingIntent.FLAG_ONE_SHOT);

        conn_manager.requestNetwork(net_req, pending_intent_net_req_received);

然后,一旦服务从调用它的 PendingIntent 运行,我就会在服务内部做一些网络工作,然后当我完成时,我相信我需要调用 releaseNetworkRequest(PendingIntent)。

但这就是我的全部问题,我如何从服务内部引用启动服务的 PendingIntent?不能保证创建 NetworkRequest 和 PendingIntent 的 Activity 仍然存在,所以我不能依赖返回到那个 Activity 来调用 releaseNetworkRequest(PendingIntent) 我参考了 PendingIntent .

Android 特别指出,您必须将相同的 PendingIntent 传递给您传递给 conn_manager.requestNetwork(net_req, pending_intent_net_req_received); 的 releaseNetworkRequest(PendingIntent);

那么开发者应该如何释放NetworkRequest(PendingIntent)?

我能否以某种方式从服务中引用 PendingIntent?我知道 PendingIntents 即使在调用它的 Activity 教区进入深渊之后仍然存在。

我一定在这里遗漏了一些东西,PendingIntents 调用 Activities、Receivers 和 Services,none 我看到其中可以引用回原始 PendingIntent。 此外,NULL 不能传递到 releaseNetworkRequest(PendingIntent) 根据 Android 文档?

还要注意,我这样做只是因为 startUsingNetworkFeature() 已被弃用,鼓励开发人员使用 NetworkRequest(),arg!!!

我现在真的被困在这里无路可退,难得被逼到这个角落,如果有人能阐明我的这种困境,我将不胜感激。

您可以使用最初创建它时使用的相同代码在 Service 中重新创建 PendingIntent

Intent intent_sent = new Intent(activity, Service_MmsNetworkAvailable.class);
PendingIntent pending_intent_net_req_received = PendingIntent.getService(activity, 0, intent_sent,
            PendingIntent.FLAG_ONE_SHOT);

您可以使用 Service 实例代替 new Intent(...) 中的 activity,因为您只需要应用程序中的 Context

备注:

  1. 创建(或重新创建)此 PendingIntent 时可能没有必要使用 PendingIntent.FLAG_ONE_SHOT。我对 FLAG_ONE_SHOT 的行为有很多问题,所以如果我是你,我会删除它。

  2. 文档指出 PendingIntent 应该触发 Broadcast,但您使用的是 Service。这可能会或可能不会按预期工作。祝你好运!