import static android.content.Context.ACTIVITY_SERVICE;

import android.app.ActivityManager;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.content.pm.ApplicationInfo;
import android.content.pm.PackageManager;
import android.content.pm.ResolveInfo;
import android.graphics.drawable.Drawable;
import android.os.AsyncTask;
import android.util.Log;

import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.concurrent.Executors;

/**
 * android开机自启管理
 * 需要使用系统签名
 * 在主配置文件中声明android:sharedUserId="android.uid.system"
 * 摘自于 github:https://github.com/hekangcode/BootManager
 */
public class BootStartHelper {
    private static final String TAG = "BootStartUtils";

    /**
     * 自启动白名单
     */
    private static final String[] APP_WHITE_LIST = {"com.tyw.launcher"};

    private Context context;
    private ActivityManager mActivityManager;

    public BootStartHelper(Context context) {
        this.context = context;
    }

    /**
     * 禁止开机启动
     *
     * @param appInfo
     */
    public void disableAutoStart(AppInfo appInfo) {
        if (appInfo.isReceiverEnable()) {
            PackageManager packageManager = context.getPackageManager();
            List<BootReceiverComponentInfo> componentNamesList = appInfo.getBootComponentList();
            for (int i = 0; i < componentNamesList.size(); i++) {
                BootReceiverComponentInfo componentInfo = componentNamesList.get(i);
                packageManager.setComponentEnabledSetting(componentInfo.getComponentName(),
                        PackageManager.COMPONENT_ENABLED_STATE_DISABLED, PackageManager.DONT_KILL_APP);
            }
            setPackageForceStop(appInfo.getPackageName());
            appInfo.setReceiverEnable(false);
        }
    }

    /**
     * 允许开机启动
     *
     * @param appInfo
     */
    public void enableAutoStart(AppInfo appInfo) {
        if (!appInfo.isReceiverEnable()) {
            PackageManager packageManager = context.getPackageManager();
            List<BootReceiverComponentInfo> componentNamesList = appInfo.getBootComponentList();
            for (int i = 0; i < componentNamesList.size(); i++) {
                BootReceiverComponentInfo componentInfo = componentNamesList.get(i);
                if (!componentInfo.isComponentEnable()) {
                    packageManager.setComponentEnabledSetting(componentInfo.getComponentName(),
                            PackageManager.COMPONENT_ENABLED_STATE_ENABLED, PackageManager.DONT_KILL_APP);
                }
            }
            appInfo.setReceiverEnable(true);
        }
    }


    /**
     * 加载回调
     */
    public interface OnLoadBootStartApp {
        void onfinish(List<AppInfo> apps);
    }

    /**
     * 获取开机启动列表
     */
    public void getAllBootStartUserApp(OnLoadBootStartApp lis) {
        new AsyncTask<Void, Integer, List<AppInfo>>() {

            @Override
            protected List<AppInfo> doInBackground(Void... voids) {
                return getAllBootStartUserApp();
            }

            @Override
            protected void onPostExecute(List<AppInfo> appInfos) {
                super.onPostExecute(appInfos);
                if (lis != null) {
                    lis.onfinish(appInfos);
                }
            }
        }.execute();

    }

    /**
     * @param whiteArr 白名单数组
     */
    private List<AppInfo> getAllBootStartUserApp() {
        List<AppInfo> mList = new ArrayList<>();
        PackageManager pm = context.getPackageManager();
        List<ResolveInfo> receiversList = pm.queryBroadcastReceivers(new Intent(Intent.ACTION_BOOT_COMPLETED), PackageManager.GET_DISABLED_COMPONENTS);
        Map<String, AppInfo> appMap = null;
        if (receiversList != null && receiversList.size() > 0) {
            appMap = new HashMap<>();
            String[] appWhiteList = APP_WHITE_LIST;
            for (ResolveInfo resolveinfo : receiversList) {
                ApplicationInfo appInfo = resolveinfo.activityInfo.applicationInfo;
                String packageName = appInfo.packageName;
                if ((appInfo.flags & ApplicationInfo.FLAG_SYSTEM) != 0 || Arrays.asList(appWhiteList).contains(packageName)) {
                    continue;
                }
                List<BootReceiverComponentInfo> componentList = new ArrayList<>();
                BootReceiverComponentInfo componentInfo = new BootReceiverComponentInfo();
                AppInfo app = new AppInfo();
                ComponentName componentName = new ComponentName(packageName, resolveinfo.activityInfo.name);
                boolean componentEnable = pm.getComponentEnabledSetting(componentName) != PackageManager.COMPONENT_ENABLED_STATE_DISABLED;
                componentInfo.setComponentName(componentName);
                componentInfo.setComponentEnable(componentEnable);
                if (appMap.containsKey(packageName)) {
                    appMap.get(packageName).getBootComponentList().add(componentInfo);
                } else {
                    app.setPackageName(packageName);
                    app.setName(appInfo.loadLabel(pm).toString());
                    app.setIcon(appInfo.loadIcon(pm));
                    componentList.add(componentInfo);
                    app.setBootComponentList(componentList);
                    appMap.put(packageName, app);
                }
            }
        }
        if (appMap != null && appMap.size() > 0) {
            Iterator iterator = appMap.entrySet().iterator();
            while (iterator.hasNext()) {
                Map.Entry entry = (Map.Entry) iterator.next();
                AppInfo app = (AppInfo) entry.getValue();
                if (app != null && app.getBootComponentList() != null && app.getBootComponentList().size() > 0) {
                    boolean receiverEnable = true;
                    for (int i = 0; i < app.getBootComponentList().size(); i++) {
                        receiverEnable = receiverEnable && app.getBootComponentList().get(i).isComponentEnable();
                    }
                    app.setReceiverEnable(receiverEnable);
                    mList.add(app);

                }
            }
            //杀死禁止启动app
            if (mList.size() > 0) {
                for (int i = 0; i < mList.size(); i++) {
                    AppInfo appInfo = mList.get(i);
                    if (!appInfo.isReceiverEnable()) {
                        setPackageForceStop(appInfo.getPackageName());
                    }

                }
            }
        }
        return mList;
    }


    /**
     * 杀死应用
     *
     * @param pkg
     */
    private void setPackageForceStop(String pkg) {
        Log.d(TAG, "ForceStop app------>" + pkg);
        //杀死应用
        try {
            Method method = Class.forName("android.app.ActivityManager").getMethod("forceStopPackage", String.class);
            if (mActivityManager == null) {
                mActivityManager = (ActivityManager) context.getSystemService(ACTIVITY_SERVICE);
            }
            method.invoke(mActivityManager, pkg);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public class AppInfo {
        private String packageName;
        private String name;
        private Drawable icon;
        private boolean receiverEnable; // 综合得出的开机广播接收者的启动模式,true 为开启状态 false 为关闭状态
        private List<BootReceiverComponentInfo> bootComponentList;

        public String getPackageName() {
            return packageName;
        }

        public void setPackageName(String packageName) {
            this.packageName = packageName;
        }

        public String getName() {
            return name;
        }

        public void setName(String name) {
            this.name = name;
        }

        public Drawable getIcon() {
            return icon;
        }

        public void setIcon(Drawable icon) {
            this.icon = icon;
        }

        public boolean isReceiverEnable() {
            return receiverEnable;
        }

        public void setReceiverEnable(boolean receiverEnable) {
            this.receiverEnable = receiverEnable;
        }

        public List<BootReceiverComponentInfo> getBootComponentList() {
            return bootComponentList;
        }

        public void setBootComponentList(List<BootReceiverComponentInfo> bootComponentList) {
            this.bootComponentList = bootComponentList;
        }
    }

    public class BootReceiverComponentInfo {

        private ComponentName componentName;
        private boolean ComponentEnable;

        public ComponentName getComponentName() {
            return componentName;
        }

        public void setComponentName(ComponentName componentName) {
            this.componentName = componentName;
        }

        public boolean isComponentEnable() {
            return ComponentEnable;
        }

        public void setComponentEnable(boolean componentEnable) {
            ComponentEnable = componentEnable;
        }
    }
}

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐