android10 系统api实现app开机启动管理
车机系统开发,基于android10.调用系统api实现启动和关闭app的开机自启功能。
·
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;
}
}
}
更多推荐



所有评论(0)