如何以编程方式启用/禁用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

在Android O中以编程方式启用和禁用Android设备中的后台数据的想法值得分享,因为我在搜索时找不到解决方案。谢谢。

列入舱单所需的许可是

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