Android 白名单保活

最近有遇到保活的需求,一开始想到的就是之前的黑科技保活比如像素Activity,播放无声MP3,双进程等方法,但是随着Android系统的更新,这些非常规的方法或多或少都已经失效了。作为研发虽然很不乐意做这种功能,但是产品是不是提一句,没办法只有硬着头皮做了。接下来就是愉快的码代码。

1.方法一常驻通知栏

对于部分APP来说,常驻通知栏就能达到基本保活的需求,其实就是在APP启动的时候创建一Service,重写onStartCommand并返回1将应用设置为前台应用;当然通知栏还要适配一下Android O

@Overridepublic int onStartCommand(Intent intent, int flags, int startId) {    NotificationManager notificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);    if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {        NotificationChannel channel = new NotificationChannel("Demo","应用包名"+"demo", NotificationManager.IMPORTANCE_LOW);        assert notificationManager != null;        notificationManager.createNotificationChannel(channel);    }    startForeground(1,getNotification());    return START_STICKY;}
private Notification getNotification() {    Intent contentIntent = new Intent();    contentIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);    contentIntent.setAction("android.settings.APPLICATION_DETAILS_SETTINGS");    contentIntent.setData(Uri.fromParts("package", "应用包名", null));    Notification.Builder builder = new Notification.Builder(this)        .setSmallIcon(R.mipmap.logo_icon_xiaowo)        .setContentIntent(PendingIntent.getActivity(this, 0, contentIntent, 0))        .setContentTitle("\""+"应用包名"+"\"正在运行")        .setContentText("触摸即可了解详情或停止应用");    //设置Notification的ChannelID,否则不能正常显示    if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {        builder.setChannelId("Demo");    }    return builder.build();}

2.添加白名单实现保活

虽然说通知栏能实现基本的保活,但是并不达到产品的需求,所以只能继续尝试其他方法了,在将所有黑科技方法都尝试过一遍之后发现随着Android系统的更新,这些方法或多或少都失效了。后来想起来之前在浏览洪洋博客的时候有一篇写到添加Android白名单实现保活的文章,就又翻出来看了一下,虽然只支持Android M 及以上版本,同时添加白名单会增加耗电量,但是因为用户基本都是固定客户所以最终也就采用了此方法。

虽然我所需要适配的手机型号并没有这么多,但是还是全部列举下来了,万一以后需要呢~ 哈哈:

final static String  IS_HUAWEI = "isHuawei"; //华为final static String  IS_XIAOMI = "isXiaomi"; //小米final static String  IS_OPPO = "isOppo";  //oppofinal static String  IS_VIVO = "isVivo"; //vivofinal static String  IS_MEIZU = "isMeizu"; //魅族final static String  IS_SAMSUNG = "isSamsung"; //三星final static String  IS_LETV = "isLetv"; //乐视final static String  IS_SMARTISAN = "isSmartisan"; //锤子

1.判断应用是否添加在白名单之中

@RequiresApi(Build.VERSION_CODES.M)public boolean isIgnoringBatteryOptimizations(Context context){    boolean isIgnoring = false;    PowerManager powerManager = (PowerManager) context.getSystemService(Context.POWER_SERVICE);    if (powerManager != null)        isIgnoring = powerManager.isIgnoringBatteryOptimizations("包名");     return isIgnoring;}

2.如果不存在则申请加入白名单,使用弹框引导用户

public void requestIgnoreBatteryOptimizations(Context context){    try {        Intent intent = new Intent(Settings.ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONS);        intent.setData(Uri.parse("package:" + "包名"));        context.startActivity(intent);    }catch (Exception e){            e.printStackTrace();    }}

3.因为需求,所以我在onActivityResult方法中再一次对应用进行判断,如果应用还是不存在于白名单中则继续申请;同时也给予了用户主动跳转到设置页面去添加的方法,因为不同的手机产商后台管理不一样,所以博主也定义两个跳转的方法,同时也测试了大部分主流Android手机厂商,这让我们这些搬砖的可以直接使用。

/*** 跳转到指定应用的首页*/public void showActivity(String packageName,Context context){    Intent intent = context.getPackageManager().getLaunchIntentForPackage(packageName);    context.startActivity(intent);}/***  跳转到指定应用的指定页面* */public void showActivity(String packageName,String activityDir,Context context){    Intent intent = new Intent();    intent.setComponent(new ComponentName(packageName, activityDir));    intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);    context.startActivity(intent);}

4.这时候我们需要对手机厂商进行判断

//判断手机厂商public String checkPhoneFirm(){    String phoneState = Build.BRAND.toLowerCase(); //获取手机厂商    if (phoneState.equals("huawei") || phoneState.equals("honor"))        return PhoneConstant.IS_HUAWEI;    else if (phoneState.equals("xiaomi") && Build.BRAND != null)        return PhoneConstant.IS_XIAOMI;    else if (phoneState.equals("oppo") && Build.BRAND != null)        return PhoneConstant.IS_OPPO;    else if (phoneState.equals("vivo") && Build.BRAND != null)        return PhoneConstant.IS_VIVO;    else if (phoneState.equals("meizu") && Build.BRAND != null)        return PhoneConstant.IS_MEIZU;    else if (phoneState.equals("samsung") && Build.BRAND != null)        return PhoneConstant.IS_SAMSUNG;    else if (phoneState.equals("letv") && Build.BRAND != null)        return PhoneConstant.IS_LETV;    else if (phoneState.equals("smartisan") && Build.BRAND != null)        return PhoneConstant.IS_SMARTISAN;    return "";}

5.在知道手机厂商之后我们就可以跳转到对应的后台进行设置了

//前往设置管理public void  gotoWhiteListSetting(Context context){    if (checkPhoneFirm().equals(PhoneConstant.IS_HUAWEI)){        try {            showActivity("com.huawei.systemmanager","com.huawei.systemmanager.startupmgr.ui.StartupNormalAppListActivity",context);        }catch (Exception e){            showActivity("com.huawei.systemmanager",                        "com.huawei.systemmanager.optimize.bootstart.BootStartActivity",context);        }    }else if (checkPhoneFirm().equals(PhoneConstant.IS_XIAOMI)){            showActivity("com.miui.securitycenter",                    "com.miui.permcenter.autostart.AutoStartManagementActivity",context);    }else if (checkPhoneFirm().equals(PhoneConstant.IS_OPPO)){        //oppo:操作步骤:权限隐私 -> 自启动管理 -> 允许应用自启动        try {             showActivity("com.coloros.phonemanager",context);        } catch (Exception e) {             try {                showActivity("com.oppo.safe",context);             } catch (Exception e2) {                try {                    showActivity("com.coloros.oppoguardelf", context);                } catch (Exception e3) {                    showActivity("com.coloros.safecenter", context);                }            }    }    }else if (checkPhoneFirm().equals(PhoneConstant.IS_VIVO)){        //vivo:操作步骤:权限管理 -> 自启动 -> 允许应用自启动        showActivity("com.iqoo.secure", context);    }else if (checkPhoneFirm().equals(PhoneConstant.IS_MEIZU)){        //魅族:操作步骤:权限管理 -> 后台管理 -> 点击应用 -> 允许后台运行        showActivity("com.meizu.safe", context);    }else if (checkPhoneFirm().equals(PhoneConstant.IS_SAMSUNG)){        //三星:操作步骤:自动运行应用程序 -> 打开应用开关 -> 电池管理 -> 未监视的应用程序 -> 添加应用        try {            showActivity("com.samsung.android.sm_cn",context);        } catch (Exception e) {            showActivity("com.samsung.android.sm",context);        }    }else if (checkPhoneFirm().equals(PhoneConstant.IS_LETV)){        //乐视:操作步骤:自启动管理 -> 允许应用自启动            showActivity("com.letv.android.letvsafe","com.letv.android.letvsafe.AutobootManageActivity", context);    }else if (checkPhoneFirm().equals(PhoneConstant.IS_SMARTISAN)){        //锤子:操作步骤:权限管理 -> 自启动权限管理 -> 点击应用 -> 允许被系统启动        showActivity("com.smartisanos.security", context );    }}

到这里白名单保活就结束了。做个笔记记录一下~

更多相关文章

  1. 如何使用Android(安卓)UI Fragment开发“列表-详情”界面
  2. 以 Okhttp3源码 为例 ------ 图解 缓存机制 的原理和实现(下)
  3. android webview与H5混合开发,webview自定义缓存
  4. [Android]用架构师角度看插件化(2)-Replugin 唯一hook点
  5. 【Android自定义View】 仿照腾讯漫画自定义Toast的实现
  6. 与ios相比,android为什么越用越卡
  7. Kotlin在Android端的基本用法详解
  8. Android绘图机制(一)——自定义View的基础属性和方法
  9. Android中使用SAX对XMl文件进行解析

随机推荐

  1. XML指南——XML元素
  2. PHP扩展之XML操作(四)——XMLReader
  3. 解析XML的方法
  4. XML指南——XML 浏览器(Netscape、Explore
  5. PHP扩展之XML操作(三)——XML解析器使用及
  6. XML指南——察看 XML 文件
  7. XML指南——XML数据岛
  8. XML指南——XML 属性
  9. XML卷之实战锦囊(4):选单连动
  10. XML指南——XML编码