前文:相信很多开发者在项目中都使用到了极光推送,极光推送也是一个让我们又爱又恨的需求,如果项目中对推送依赖多点,就会发现各种问,比如推送后进行播报之类的,经常会收到反馈,过一会没推送播报了,黑屏一阵就没了,杀进程没了,这一类问题很坑,不是属于逻辑性问题,优化性难点也很大。以前在项目中遇到过这一类的坑,如果不开VIP,推送的送达率没保证,不对接厂商,是没法在进程杀死的情况下进行接收推送的。
在排除掉外界元素外,公司只愿意用免费的,那只能我们尽力去处理了,首先逻辑没问题,那就在权限上做优化,都知道Android权限需要动态申请,进程存活过久,因为手机系统的电池优化,黑屏后后台休眠之类的会导致APP不接收播报,在点亮后,全接收到了,对于这一类的,可以自己做检测,此处,写下本wolf在项目中遇到的坑,提供下需要检测的权限和需要检测的方法,各位可以在项目中加一个检测的功能。
应用未开启通知权限,那后果就不用说了,检测与跳转方法如下,我封装了类方法。
/**
* 判断是否开启了通知权限 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);
}
电池优化白名单,这样才不会因为耗电被系统杀死
/**
* 判断是否忽略电池省电
*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();
}
}
/**
* 跳转到自启动页面
* @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);
}
}
这个需求应该与检测网络是否可用的写在一起,就比较简单,直接贴代码
// 去 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世预赛开门红,希望国足挺进卡塔尔。