Android 代码打开手机权限保证推送存活率

前文:相信很多开发者在项目中都使用到了极光推送,极光推送也是一个让我们又爱又恨的需求,如果项目中对推送依赖多点,就会发现各种问,比如推送后进行播报之类的,经常会收到反馈,过一会没推送播报了,黑屏一阵就没了,杀进程没了,这一类问题很坑,不是属于逻辑性问题,优化性难点也很大。以前在项目中遇到过这一类的坑,如果不开VIP,推送的送达率没保证,不对接厂商,是没法在进程杀死的情况下进行接收推送的。

在排除掉外界元素外,公司只愿意用免费的,那只能我们尽力去处理了,首先逻辑没问题,那就在权限上做优化,都知道Android权限需要动态申请,进程存活过久,因为手机系统的电池优化,黑屏后后台休眠之类的会导致APP不接收播报,在点亮后,全接收到了,对于这一类的,可以自己做检测,此处,写下本wolf在项目中遇到的坑,提供下需要检测的权限和需要检测的方法,各位可以在项目中加一个检测的功能。

1、通知权限

应用未开启通知权限,那后果就不用说了,检测与跳转方法如下,我封装了类方法。

  /**
     * 判断是否开启了通知权限 true 开启 false 未开启
     * @param context
     * @return
     */
  
    public static boolean isNotificationEnabled(Context context) {
        NotificationManagerCompat notification = NotificationManagerCompat.from(context);
        boolean isEnabled = notification.areNotificationsEnabled();
        return isEnabled;
    }

/**
     * 跳转到通知管理的界面,去手动开启
     * @param context
     */
    public static void intentToNotification(Context context){
        Intent localIntent = new Intent();
        localIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        if (Build.VERSION.SDK_INT >= 9) {
            localIntent.setAction("android.settings.APPLICATION_DETAILS_SETTINGS");
            localIntent.setData(Uri.fromParts("package", context.getPackageName(), null));
        } else if (Build.VERSION.SDK_INT <= 8) {
            localIntent.setAction(Intent.ACTION_VIEW);
            localIntent.setClassName("com.android.settings", "com.android.settings.InstalledAppDetails");
            localIntent.putExtra("com.android.settings.ApplicationPkgName", context.getPackageName());
        }
        context.startActivity(localIntent);


    }

        2、 电池优化

电池优化白名单,这样才不会因为耗电被系统杀死

 /**
     * 判断是否忽略电池省电
     *true 开启忽略电池优化  false 不开启忽略电池优化
     * @param context
     * @return
     */
    
    public static boolean isBatteryOpen(Context context){
        PowerManager powerManager = (PowerManager) context.getSystemService(POWER_SERVICE);

        boolean hasIgnored = powerManager.isIgnoringBatteryOptimizations(context.getPackageName());
        return hasIgnored;
    } 



 /**
     * 忽略电池优化,未开启就弹框
     * @param context
     */
    
    public static void ignoreBatteryOptimization(Context context) {

        PowerManager powerManager = (PowerManager) context.getSystemService(POWER_SERVICE);

        boolean hasIgnored = powerManager.isIgnoringBatteryOptimizations(context.getPackageName());
        //  判断当前APP是否有加入电池优化的白名单,如果没有,弹出加入电池优化的白名单的设置对话框。
        String aa= context.getPackageName();
        if (!hasIgnored) {
            Intent intent = new Intent(Settings.ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONS);
            intent.setData(Uri.parse("package:" + context.getPackageName()));
            context.startActivity(intent);
        }else {
            Toast.makeText(context,"已设置电池优化", Toast.LENGTH_SHORT).show();
        }

    }

3、开启后台启动,自启动权限,尽可能保证在后台存活

 /**
     * 跳转到自启动页面
     * @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());
            String aa = 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")) { // 华为测试通过
                intent.setAction("huawei.intent.action.HSM_BOOTAPP_MANAGER");
                componentName = ComponentName.unflattenFromString("com.huawei.systemmanager/.startupmgr.ui.StartupNormalAppListActivity");//跳自启动管理
//                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");
//                componentName = ComponentName.unflattenFromString("com.iqoo.secure/.ui.phoneoptimize.AddWhiteListActivity");
                componentName = ComponentName.unflattenFromString("com.vivo.permissionmanager/.activity.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);
        }
    }

 

4、检测wifi是否开启,跳转到开启wifi页

这个需求应该与检测网络是否可用的写在一起,就比较简单,直接贴代码


    // 去 WIFI 设置界面
    public static void goToSetWIFI(Context context){
        Intent wifiSettingsIntent = new Intent("android.settings.WIFI_SETTINGS");
        context.startActivity(wifiSettingsIntent);
    }

 

PS:检测网络不应该只检测网络是否可用,因为网络不稳定时候,也会导致不能及时收到推送,因此,检测网络应该检测网络的丢包率,丢包率的原理就是写一段代码,去检测下下载某个图片,或者打开某个网址去分段计算下稳定率,丢包率,后续会写出这个工具类的介绍,此处为本wolf爬坑时遇到的,虽然可能在10.0系统出现跟新机器出现会有部分适配问题,但是目前大部分的机型都可以满足,如果有遇到不适配的,请留言,本wolf尽力解决,本篇有错误之处,请及时指出,有则改之,无则加勉,昨晚国足5-0世预赛开门红,希望国足挺进卡塔尔。

 

 

你可能感兴趣的:(Android,胖胖狼,fat,wolf,权限,Android)