Android打开自启动设置页面

由于Linux的开源,市面上出现了很多定制的Android系统,这写系统有的将Android原生系统改的面目全非,很多方法不能同时在所有机型上适用,这是问题的一大难点。


项目中遇见了一个问题,我用JPush SDK推送消息,但是如果服务被关闭,将无法及时接收消息。这样也就没有起到应有的效果。所以我想让我的app接收系统广播,每次接收到Intent.ACTION_TIME_TICK这个广播我就去检查服务是否被关闭。可是这样就要面对另外一个问题:当用户使用第三方清理软件清理系统后,我的app就被标记为了stopped状态,无法再接收到系统广播,解决方法我倒是有一个,那就是让用户把我的app添加进自启动白名单里面,这样手机就能够接收系统广播了。当然你也可以把app安装进系统目录,这样就能像系统app一样接收系统广播了,但是我们不是流氓软件,所以我们没打算这样做。


这就需要我们拉起系统自启动设置页面,下面给出代码:

public class OpenAutoStartUtil {
    /**
     * Get Mobile Type
     *
     * @return
     */
    private static String getMobileType() {
        return Build.MANUFACTURER;
    }

    /**
     * GoTo Open Self Setting Layout
     * Compatible Mainstream Models 兼容市面主流机型
     *
     * @param context
     */
    public static void jumpStartInterface(Context context) {
        Intent intent = new Intent();
        try {
            intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
            Log.e("HLQ_Struggle", "******************当前手机型号为:" + getMobileType());
            ComponentName componentName = null;
            if (getMobileType().equals("Xiaomi")) { // 红米Note4测试通过
                componentName = new ComponentName("com.miui.securitycenter",
                        "com.miui.permcenter.autostart.AutoStartManagementActivity");
            } else if (getMobileType().equals("Letv")) { // 乐视2测试通过
                intent.setAction("com.letv.android.permissionautoboot");
            } else if (getMobileType().equals("samsung")) { // 三星Note5测试通过
                componentName = new ComponentName("com.samsung.android.sm_cn",
                        "com.samsung.android.sm.ui.ram.AutoRunActivity");
            } else if (getMobileType().equals("HUAWEI")) { // 华为测试通过
                componentName = new ComponentName("com.huawei.systemmanager",
                        "com.huawei.systemmanager.optimize.process.ProtectActivity");
            } else if (getMobileType().equals("vivo")) { // VIVO测试通过
                componentName = ComponentName.unflattenFromString("com.iqoo.secure" +
                        "/.safeguard.PurviewTabActivity");
            } else if (getMobileType().equals("Meizu")) { //万恶的魅族
                // 通过测试,发现魅族是真恶心,也是够了,之前版本还能查看到关于设置自启动这一界面,
                // 系统更新之后,完全找不到了,心里默默Fuck                // 针对魅族,我们只能通过魅族内置手机管家去设置自启动,
                // 所以我在这里直接跳转到魅族内置手机管家界面,具体结果请看图
                componentName = ComponentName.unflattenFromString("com.meizu.safe" +
                        "/.permission.PermissionMainActivity");
            } else if (getMobileType().equals("OPPO")) { // OPPO R8205测试通过
                componentName = ComponentName.unflattenFromString("com.oppo.safe" +
                        "/.permission.startup.StartupAppListActivity");
                Intent intentOppo = new Intent();
                intentOppo.setClassName("com.oppo.safe/.permission.startup",
                        "StartupAppListActivity");
                if (context.getPackageManager().resolveActivity(intentOppo, 0) == null) {
                    componentName = ComponentName.unflattenFromString("com.coloros.safecenter" +
                            "/.startupapp.StartupAppListActivity");
                }

            } else if (getMobileType().equals("ulong")) { // 360手机 未测试
                componentName = new ComponentName("com.yulong.android.coolsafe",
                        ".ui.activity.autorun.AutoRunListActivity");
            } else {             
                // 以上只是市面上主流机型,由于公司你懂的,所以很不容易才凑齐以上设备
                // 针对于其他设备,我们只能调整当前系统app查看详情界面
                // 在此根据用户手机当前版本跳转系统设置界面
                if (Build.VERSION.SDK_INT >= 9) {
                    intent.setAction("android.settings.APPLICATION_DETAILS_SETTINGS");
                    intent.setData(Uri.fromParts("package", context.getPackageName(), null));
                } else if (Build.VERSION.SDK_INT <= 8) {
                    intent.setAction(Intent.ACTION_VIEW);
                    intent.setClassName("com.android.settings",
                            "com.android.settings.InstalledAppDetails");
                    intent.putExtra("com.android.settings.ApplicationPkgName",
                            context.getPackageName());
                }
            }
            intent.setComponent(componentName);
            context.startActivity(intent);
        } catch (Exception e) {//抛出异常就直接打开设置页面
            intent = new Intent(Settings.ACTION_SETTINGS);
            context.startActivity(intent);
        }
    }
}

这样的方法我们可以适配市面上大部分手机了。

本来我是想过用代码将自己的app设置为开机自启动,但是从网络上找了很多方法,最后还是没有成功,希望有这方面经验的大神不吝赐教,拜谢!


想到我们打开软件的时候就应该判断我们的app是否已经被允许自启动了,我又遇见了一个难题,至今未能解决。怎么样才能像手机安全卫士一样获取到有哪些应用被允许自启动了呢?网上有人说看是否有开机启动权限,不可行,因为有权限也不能保证开机启动,因为用户如果禁止了,你的权限就不起作用了。还有看到一个大神的方法,记得好像是获取自启动的状态,但是不管用户允许了自启动还是禁止了,其状态都是0(默认),这方法也不可行。有哪位大神知道的话,还请告知,拜谢!




  • 2
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值