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

时间:2018-04-24 06:09:23

标签: android networking android-pendingintent

我正在尝试请求网络,所以我构建了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传入releaseNetworkRequest(PendingIntent),并将其传递给conn_manager.requestNetwork(net_req,pending_intent_net_req_received);

那么开发人员应该如何发布网络请求(PendingIntent)?

我可以以某种方式从服务中引用PendingIntent吗?我知道PendingIntents即使在调用它进入深渊的活动之后仍然活着。

我必须在这里遗漏一些东西,PendingIntents调用活动,接收器和服务,我看到的所有内容都不能引用回原来的PendingIntent。 此外,NULL无法传递到releaseNetworkRequest(PendingIntent) 根据Android文档?

另外请注意,我只是这样做,因为不推荐使用startUsingNetworkFeature(),鼓励开发人员使用NetworkRequest(),arg !!!

我现在真的被困在这里,没有办法去,如果有人能够解释我的这种困境,我很少会如此支持这个角落我将不胜感激。

1 个答案:

答案 0 :(得分:1)

您可以使用您在首次创建时使用的相同代码在PendingIntent中重新创建Service

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);

而不是activity中的new Intent(...),您可以使用Service实例,因为您只需要应用中的Context

注意:

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

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