如何以编程方式启用/禁用Android中的后台数据?
在Android O中以编程方式启用和禁用Android设备中的后台数据的想法值得分享,因为我在搜索时找不到解决方案。谢谢。列入舱单所需的许可是如何以编程方式启用/禁用Android中的后台数据?,android,networking,Android,Networking,在Android O中以编程方式启用和禁用Android设备中的后台数据的想法值得分享,因为我在搜索时找不到解决方案。谢谢。列入舱单所需的许可是 <uses-permission android:name="android.permission.MANAGE_NETWORK_POLICY" tools:ignore="ProtectedPermissions"/> 在Android O设备上测试和验证 private static final int THREAD_WAIT_TIM
<uses-permission android:name="android.permission.MANAGE_NETWORK_POLICY" tools:ignore="ProtectedPermissions"/>
在Android O设备上测试和验证
private static final int THREAD_WAIT_TIMEOUT_IN_MS = 100;
private boolean restrictBackgroundData(boolean enable, int timeout) {
Boolean result = false;
try {
final ConnectivityManager connectivityManager = (ConnectivityManager) getContext()
.getSystemService(Context.CONNECTIVITY_SERVICE);
Class connectivityManagerClass = Class.forName(connectivityManager.getClass().getName());
final Method getNetworkPolicyManager = connectivityManagerClass.getDeclaredMethod(
"getNetworkPolicyManager");
getNetworkPolicyManager.setAccessible(true);
final Object iNetworkPolicyManager = getNetworkPolicyManager.invoke(connectivityManager);
final Class iNetworkPolicyManagerClass = Class.forName(iNetworkPolicyManager.getClass()
.getName());
final Method setRestrictBackground = iNetworkPolicyManagerClass.getDeclaredMethod("setRestrictBackground",
boolean.class);
final Method getRestrictBackground = iNetworkPolicyManagerClass.getDeclaredMethod("getRestrictBackground");
setRestrictBackground.setAccessible(true);
getRestrictBackground.setAccessible(true);
// Check if the state is already set
result = (Boolean) getRestrictBackground.invoke(iNetworkPolicyManager);
result = ((result && enable) || ((!result) && (!enable)));
if (!result) {
// Set state
setRestrictBackground.invoke(iNetworkPolicyManager, enable);
while (timeout > 0) {
// Check if the state is set
result = (Boolean) getRestrictBackground.invoke(iNetworkPolicyManager);
result = ((result && enable) || ((!result) && (!enable)));
if (result) {
break;
}
try {
Thread.sleep(THREAD_WAIT_TIMEOUT_IN_MS);
} catch (InterruptedException e) {
}
timeout -= THREAD_WAIT_TIMEOUT_IN_MS;
}
}
} catch (Exception e) {
}
return result;
}