如何在 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
。
备注:
创建(或重新创建)此 PendingIntent
时可能没有必要使用 PendingIntent.FLAG_ONE_SHOT
。我对 FLAG_ONE_SHOT
的行为有很多问题,所以如果我是你,我会删除它。
文档指出 PendingIntent
应该触发 Broadcast
,但您使用的是 Service
。这可能会或可能不会按预期工作。祝你好运!
我正在尝试请求网络,因此我构建了 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
。
备注:
创建(或重新创建)此
PendingIntent
时可能没有必要使用PendingIntent.FLAG_ONE_SHOT
。我对FLAG_ONE_SHOT
的行为有很多问题,所以如果我是你,我会删除它。文档指出
PendingIntent
应该触发Broadcast
,但您使用的是Service
。这可能会或可能不会按预期工作。祝你好运!