系统Doze白名单常用接口

  1. 获取Doze白名单列表:DeviceIdleController.getUserPowerWhitelist
  2. 是否Doze白名单:DeviceIdleController.isPowerSaveWhitelistApp
  3. Doze白名单变化广播:PowerManager.ACTION_POWER_SAVE_WHITELIST_CHANGED
  4. 设置Doze白名单:DeviceIdleController.addPowerSaveWhitelistApp
package com.android.server.doze;

import android.app.usage.UsageStatsManager;
import android.app.usage.UsageStatsManagerInternal;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.os.Handler;
import android.os.IDeviceIdleController;
import android.os.PowerManager;
import android.os.RemoteException;
import android.os.ServiceManager;
import android.os.SystemClock;
import android.util.ArrayMap;

import com.android.server.LocalServices;
import com.android.server.usage.AppStandbyConfig;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;

public class UserWhiteList {

    public static final String TAG = "UserWhiteList";
    private static final ArrayMap<String, IWhiteListChangedListener> mListeners = new ArrayMap<>();
    private final IDeviceIdleController mDeviceIdleController;
    private final UsageStatsManagerInternal mUsageStatsService;
    private static final List<String> mWhiteAllList = new ArrayList<>();
    //监听的回调:
    private final BroadcastReceiver mBroadcastReceiver = new BroadcastReceiver() {
        @Override
        public void onReceive(Context context, Intent intent) {
            if (null == intent) {
                return;
            }

            switch (intent.getAction()) {
                case PowerManager.ACTION_POWER_SAVE_WHITELIST_CHANGED:
                    synchronized (mListeners) {
                        onUserWhiteListChanged();
                        for (Map.Entry<String, IWhiteListChangedListener> entity : mListeners.entrySet()) {
                            IWhiteListChangedListener lsr = entity.getValue();
                            if (lsr != null) {
                                lsr.onUserWhiteListChanged();
                            }
                        }

                        List<String> dozeWhiteList = getUserPowerWhitelist(true);
                        if (null != dozeWhiteList) {
                            String dozeWhiteListInfo = "ACTION_POWER_SAVE_WHITELIST_CHANGED " +
                                    "onUserWhiteListChanged " + dozeWhiteList;
                            PowerLog.getInstance().writePowerFeatureLog(dozeWhiteListInfo);
                        }
                    }
                    break;
                case Intent.ACTION_PACKAGE_ADDED:
                    final String packageName = intent.getData().getEncodedSchemeSpecificPart();
                    if (null == packageName) {
                        break;
                    }

                    // keep pre doze config while app update event
                    if (intent.getBooleanExtra(Intent.EXTRA_REPLACING, false)) {
                        break;
                    }

                    // add app to doze white list while app install event
                    if (AppStandbyConfig.isDozePkgWhiteList(packageName)
                            && !isPowerSaveWhitelistApp(packageName)) {
                        addPowerSaveWhitelistApp(packageName);
                        String whiteAppInfo = "ACTION_PACKAGE_ADDED " +
                                "addPowerSaveWhitelistApp " + "packageName:" + packageName;
                        Nslog.d(TAG_DOZE, TAG, whiteAppInfo);
                        PowerLog.getInstance().writePowerFeatureLog(whiteAppInfo);
                    }
                    break;
                default:
                    break;
            }
        }
    };

    public UserWhiteList(Context context, Handler handler) {
        mDeviceIdleController = IDeviceIdleController.Stub.asInterface(
                ServiceManager.getService("deviceidle"));
        mUsageStatsService = LocalServices.getService(UsageStatsManagerInternal.class);
        IntentFilter intentFilter = new IntentFilter(
                PowerManager.ACTION_POWER_SAVE_WHITELIST_CHANGED);
        context.registerReceiver(mBroadcastReceiver, intentFilter,
                null, handler);

        intentFilter = new IntentFilter();
        intentFilter.addAction(Intent.ACTION_PACKAGE_ADDED);
        intentFilter.addDataScheme("package");

        context.registerReceiver(mBroadcastReceiver, intentFilter,
                null, handler);
        Nslog.d(TAG_DOZE, TAG, "registerReceiver success");
    }

    public void registerWhiteListChangedListener(String feature, IWhiteListChangedListener listener) {
        synchronized (mListeners) {
            if (listener != null && feature != null) {
                mListeners.put(feature, listener);
            }
        }
    }

    public void onUserWhiteListChanged() {
        List<String> whitelist = getUserPowerWhitelist(true);
        mWhiteAllList.clear();
        mWhiteAllList.addAll(whitelist);
    }

    public List<String> getUserPowerWhitelist() {
        return mWhiteAllList;
    }

    /**
     * 获取所有白名单包名
     */
    public List<String> getUserPowerWhitelist(boolean all) {
        List<String> whitelistPkgs = new ArrayList<>();
        try {
            String[] pkgs = mDeviceIdleController.getUserPowerWhitelist();
            for (int i = 0; i < pkgs.length; i++) {
                if (!all && AppStandbyConfig.isDozePkgWhiteList(pkgs[i])) {
                    continue;
                }
                whitelistPkgs.add(pkgs[i]);
            }
        } catch (RemoteException e) {
            Nslog.d(TAG_DOZE, TAG, e.toString());
        }
        return whitelistPkgs;
    }

    /**
     * 判断是否白名单
     */
    public boolean isPowerSaveWhitelistApp(String pkg) {
        boolean isWhite = false;
        try {
            isWhite = mDeviceIdleController.isPowerSaveWhitelistApp(pkg);
        } catch (RemoteException e) {
            Nslog.d(TAG_DOZE, TAG, e.toString());
        }
        return isWhite;
    }

    /**
     * 获取白名单大小, setting可使用这个方法
     */
    public int getAppIdUserWhitelistSize() {
        try {
            int[] uids = mDeviceIdleController.getAppIdUserWhitelist();
            return uids.length;
        } catch (RemoteException e) {
            Nslog.d(TAG_DOZE, TAG, e.toString());
        }
        return 0;
    }

    public List<String> getRunningAppBuckets(List<String> run) {
        if (run == null) {
            return null;
        }
        List<String> list = new ArrayList<>();
        for (int i = 0; i < run.size(); i++) {
            int bucket = -1;
            if (null != mUsageStatsService) {
                bucket = mUsageStatsService.getAppStandbyBucket(run.get(i), 0, SystemClock.elapsedRealtime());
            }
            if (bucket == UsageStatsManager.STANDBY_BUCKET_RESTRICTED) {
                list.add(run.get(i));
            }
        }
        return list;
    }


    public boolean isInRestrictedPackage(String pkg) {
        boolean isRestricted = (UsageStatsManager.STANDBY_BUCKET_RESTRICTED <= getAppBucket(pkg));
        return isRestricted;
    }

    public int getAppBucket(String pkg) {
        int bucket = -1;
        if (null != mUsageStatsService) {
            bucket = mUsageStatsService.getAppStandbyBucket(pkg, 0, SystemClock.elapsedRealtime());
        }
        return bucket;
    }

    private void addPowerSaveWhitelistApp(String pkgName) {
        try {
            if (null == mDeviceIdleController) {
                return;
            }

            mDeviceIdleController.addPowerSaveWhitelistApp(pkgName);
        } catch (RemoteException e) {
            Nslog.d(TAG_DOZE, TAG, e.toString());
        }
    }

}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

法迪

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值