众所周知国产ROM厂商整了各种 什么安全中心, i管家 ,手机管家什么的, 里面有个自启动权限 , 新安装的app默认是拒绝自启动 所以如果你的应用需要后台运行可以通过以下工具类跳转到自启动权限界面引导用户开启自启动权限, 如果你想问怎么判断是否获取已经获得自启动权限, 我只能回答你这个目前是没办法的, 这是国内厂商的骚操作 没有api.
这个代码是网上收集的和我自己dumpactivity抓的界面路径, 由于涉及的机型过多所以没法一一测试,
原理挺简单的,只要你手机多 都能兼容, 当然为了能完美适配, 有些文章直接判断界面不存在出现异常就跳转到设置… 而我是跳转到安全中心, 据我了解, 自启动权限和应用设置没多大关系, 一般在安全中心/手机管家 中管理这个权限. 所以跳转到设置基本没意义, 还不如不写, 误导用户
adb shell dumpsys activity | findstr /r "mResumedActivity: mFocusedActivity"
打开你要适配的手机的授权界面,然后adb运行以上命令即可, 获得的activity路径 直接写到HashMap里就好 , 最后一行可以写包名, 这样如果签名的类路径在某些新版本的ROM中没找到 就直接跳转到对应的安全中心/手机管家 首页.
扯蛋个什么啊 直接上代码吧, 如果有适配问题可以回复我你的解决方案 我后面加上去造福后人, 如果觉得好用就回复牛逼! (滑稽)
/**
* 作者:东芝(2019/8/6).
* 功能:Intent跳转到[自启动]页面全网最全适配机型解决方案
*/
public class Util {
private static HashMap<String, List<String>> hashMap = new HashMap<String, List<String>>() {
{
put("Xiaomi", Arrays.asList(
"com.miui.securitycenter/com.miui.permcenter.autostart.AutoStartManagementActivity",//MIUI10_9.8.1(9.0)
"com.miui.securitycenter"
));
put("samsung", Arrays.asList(
"com.samsung.android.sm_cn/com.samsung.android.sm.ui.ram.AutoRunActivity",
"com.samsung.android.sm_cn/com.samsung.android.sm.ui.appmanagement.AppManagementActivity",
"com.samsung.android.sm_cn/com.samsung.android.sm.ui.cstyleboard.SmartManagerDashBoardActivity",
"com.samsung.android.sm_cn/.ui.ram.RamActivity",
"com.samsung.android.sm_cn/.app.dashboard.SmartManagerDashBoardActivity",
"com.samsung.android.sm/com.samsung.android.sm.ui.ram.AutoRunActivity",
"com.samsung.android.sm/com.samsung.android.sm.ui.appmanagement.AppManagementActivity",
"com.samsung.android.sm/com.samsung.android.sm.ui.cstyleboard.SmartManagerDashBoardActivity",
"com.samsung.android.sm/.ui.ram.RamActivity",
"com.samsung.android.sm/.app.dashboard.SmartManagerDashBoardActivity",
"com.samsung.android.lool/com.samsung.android.sm.ui.battery.BatteryActivity",
"com.samsung.android.sm_cn",
"com.samsung.android.sm"
));
put("HUAWEI", Arrays.asList(
"com.huawei.systemmanager/.startupmgr.ui.StartupNormalAppListActivity",//EMUI9.1.0(方舟,9.0)
"com.huawei.systemmanager/.appcontrol.activity.StartupAppControlActivity",
"com.huawei.systemmanager/.optimize.process.ProtectActivity",
"com.huawei.systemmanager/.optimize.bootstart.BootStartActivity",
"com.huawei.systemmanager"//最后一行可以写包名, 这样如果签名的类路径在某些新版本的ROM中没找到 就直接跳转到对应的安全中心/手机管家 首页.
));
put("vivo", Arrays.asList(
"com.iqoo.secure/.ui.phoneoptimize.BgStartUpManager",
"com.iqoo.secure/.safeguard.PurviewTabActivity",
"com.vivo.permissionmanager/.activity.BgStartUpManagerActivity",
// "com.iqoo.secure/.ui.phoneoptimize.AddWhiteListActivity", //这是白名单, 不是自启动
"com.iqoo.secure",
"com.vivo.permissionmanager"
));
put("Meizu", Arrays.asList(
"com.meizu.safe/.permission.SmartBGActivity",//Flyme7.3.0(7.1.2)
"com.meizu.safe/.permission.PermissionMainActivity",//网上的
"com.meizu.safe"
));
put("OPPO", Arrays.asList(
"com.coloros.safecenter/.startupapp.StartupAppListActivity",
"com.coloros.safecenter/.permission.startup.StartupAppListActivity",
"com.oppo.safe/.permission.startup.StartupAppListActivity",
"com.coloros.oppoguardelf/com.coloros.powermanager.fuelgaue.PowerUsageModelActivity",
"com.coloros.safecenter/com.coloros.privacypermissionsentry.PermissionTopActivity",
"com.coloros.safecenter",
"com.oppo.safe",
"com.coloros.oppoguardelf"
));
put("oneplus", Arrays.asList(
"com.oneplus.security/.chainlaunch.view.ChainLaunchAppListActivity",
"com.oneplus.security"
));
put("letv", Arrays.asList(
"com.letv.android.letvsafe/.AutobootManageActivity",
"com.letv.android.letvsafe/.BackgroundAppManageActivity",//应用保护
"com.letv.android.letvsafe"
));
put("zte", Arrays.asList(
"com.zte.heartyservice/.autorun.AppAutoRunManager",
"com.zte.heartyservice"
));
//金立
put("F", Arrays.asList(
"com.gionee.softmanager/.MainActivity",
"com.gionee.softmanager"
));
//以下为未确定(厂商名也不确定)
put("smartisanos", Arrays.asList(
"com.smartisanos.security/.invokeHistory.InvokeHistoryActivity",
"com.smartisanos.security"
));
//360
put("360", Arrays.asList(
"com.yulong.android.coolsafe/.ui.activity.autorun.AutoRunListActivity",
"com.yulong.android.coolsafe"
));
//360
put("ulong", Arrays.asList(
"com.yulong.android.coolsafe/.ui.activity.autorun.AutoRunListActivity",
"com.yulong.android.coolsafe"
));
//酷派
put("coolpad"/*厂商名称不确定是否正确*/, Arrays.asList(
"com.yulong.android.security/com.yulong.android.seccenter.tabbarmain",
"com.yulong.android.security"
));
//联想
put("lenovo"/*厂商名称不确定是否正确*/, Arrays.asList(
"com.lenovo.security/.purebackground.PureBackgroundActivity",
"com.lenovo.security"
));
put("htc"/*厂商名称不确定是否正确*/, Arrays.asList(
"com.htc.pitroad/.landingpage.activity.LandingPageActivity",
"com.htc.pitroad"
));
//华硕
put("asus"/*厂商名称不确定是否正确*/, Arrays.asList(
"com.asus.mobilemanager/.MainActivity",
"com.asus.mobilemanager"
));
}
};
public static void startToAutoStartSetting(Context context) {
Log.e("Util", "******************当前手机型号为:" + Build.MANUFACTURER);
Set<Map.Entry<String, List<String>>> entries = hashMap.entrySet();
boolean has = false;
for (Map.Entry<String, List<String>> entry : entries) {
String manufacturer = entry.getKey();
List<String> actCompatList = entry.getValue();
if (Build.MANUFACTURER.equalsIgnoreCase(manufacturer)) {
for (String act : actCompatList) {
try {
Intent intent;
if (act.contains("/")) {
intent = new Intent();
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
ComponentName componentName = ComponentName.unflattenFromString(act);
intent.setComponent(componentName);
} else {
//找不到? 网上的做法都是跳转到设置... 这基本上是没意义的 基本上自启动这个功能是第三方厂商自己写的安全管家类app
//所以我是直接跳转到对应的安全管家/安全中心
intent = context.getPackageManager().getLaunchIntentForPackage(act);
}
context.startActivity(intent);
has = true;
break;
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
if (!has) {
Toast.makeText(context, "兼容方案", Toast.LENGTH_SHORT).show();
try {
Intent intent = new Intent();
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
intent.setAction("android.settings.APPLICATION_DETAILS_SETTINGS");
intent.setData(Uri.fromParts("package", context.getPackageName(), null));
context.startActivity(intent);
} catch (Exception e) {
e.printStackTrace();
Intent intent = new Intent(Settings.ACTION_SETTINGS);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
context.startActivity(intent);
}
}
}
}