以编程方式避免打瞌睡模式
Avoid doze mode programmatically
我正在开发一个 Android 应用程序,它使用小米手环 1S 始终保持心率测量值。我使用一个服务来处理蓝牙连接,并且我已经实现了在应用程序关闭时保持此服务处于活动状态,甚至在手机重新启动时重新启动服务。
现在,我的问题来自 android 打瞌睡模式。我正在使用以下技巧来保持服务正常运行:
- 唤醒锁的使用
- 使用 wakefullBroadcastReceiver 在使用以下过滤器关闭时重新启动服务:
"android.intent.action.BOOT_COMPLETED"
"android.intent.action.QUICKBOOT_POWERON"
- 我自己的意图在应用程序关闭时调用,并且每 10 分钟发出一次警报。
- 以编程方式要求忽略电池优化。
代码
if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
Intent intent = new Intent();
String packageName = getPackageName();
PowerManager powerManager = (PowerManager) getSystemService(POWER_SERVICE);
if (powerManager != null && !powerManager.isIgnoringBatteryOptimizations(packageName)){
intent.setAction(Settings.ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONS);
intent.setData(Uri.parse("package:" + packageName));
startActivity(intent);
}
}
问题
我的手机phone是小米。 BOOT_COMPLETED
和 IGNORE_BATTERY_OPTIMIZATIONS
都不起作用。它们只有在我手动设置权限时才有效。我还向清单文件添加了所需的权限。
那么有没有办法允许这些权限而无需用户手动设置它们?默认情况下,WhatsApp 或 Skype 等应用程序具有这些权限。为什么我不能这样做?
另外,在小米手机上也是如此。它也会发生在所有其他移动设备上吗?
几个月前我偶然发现了同样的问题。问题是所有流行的应用程序,如 WhatsApp 和 Skype,都默认被小米允许,但不是你的应用程序。不知道后台在搞什么deal,感觉对开发者不公平
现在解决,这段代码会导致小米等手机品牌的权限设置,那些定制他们的ROM并为所欲为-
private void specialPermission() {
String alertMessage = "Please allow APP_NAME to always run in the background, else our services can't be accessed when you are in distress.";
final String brand = Build.BRAND;
AlertDialog.Builder builder = new AlertDialog.Builder(mContext);
builder.setMessage(alertMessage);
builder.setPositiveButton("OK", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialogInterface, int i) {
Intent intent = new Intent();
if (brand.equalsIgnoreCase("xiaomi")) {
intent.setComponent(new ComponentName("com.miui.securitycenter",
"com.miui.permcenter.autostart.AutoStartManagementActivity"));
startActivity(intent);
} else if (brand.equalsIgnoreCase("Letv")) {
intent.setComponent(new ComponentName("com.letv.android.letvsafe",
"com.letv.android.letvsafe.AutobootManageActivity"));
startActivity(intent);
} else if (brand.equalsIgnoreCase("Honor")) {
intent.setComponent(new ComponentName("com.huawei.systemmanager",
"com.huawei.systemmanager.optimize.process.ProtectActivity"));
startActivity(intent);
} else if (Build.MANUFACTURER.equalsIgnoreCase("oppo")) {
try {
intent.setClassName("com.coloros.safecenter",
"com.coloros.safecenter.permission.startup.StartupAppListActivity");
startActivity(intent);
} catch (Exception e) {
try {
intent.setClassName("com.oppo.safe",
"com.oppo.safe.permission.startup.StartupAppListActivity");
startActivity(intent);
} catch (Exception ex) {
try {
intent.setClassName("com.coloros.safecenter",
"com.coloros.safecenter.startupapp.StartupAppListActivity");
startActivity(intent);
} catch (Exception exx) {
exx.printStackTrace();
}
}
}
} else if (Build.MANUFACTURER.contains("vivo")) {
try {
intent.setComponent(new ComponentName("com.iqoo.secure",
"com.iqoo.secure.ui.phoneoptimize.AddWhiteListActivity"));
startActivity(intent);
} catch (Exception e) {
try {
intent.setComponent(new ComponentName("com.vivo.permissionmanager",
"com.vivo.permissionmanager.activity.BgStartUpManagerActivity"));
startActivity(intent);
} catch (Exception ex) {
try {
intent.setClassName("com.iqoo.secure",
"com.iqoo.secure.ui.phoneoptimize.BgStartUpManager");
startActivity(intent);
} catch (Exception exx) {
ex.printStackTrace();
}
}
}
}
}
});
AlertDialog dialog = builder.create();
dialog.show();
}
您所要做的就是显示一个对话框,说明您对后台服务的必要性并打开权限设置。尽管它不是一个完整的修复程序,因为 SWIPE KILL,无论如何都会停止服务。
我正在开发一个 Android 应用程序,它使用小米手环 1S 始终保持心率测量值。我使用一个服务来处理蓝牙连接,并且我已经实现了在应用程序关闭时保持此服务处于活动状态,甚至在手机重新启动时重新启动服务。
现在,我的问题来自 android 打瞌睡模式。我正在使用以下技巧来保持服务正常运行:
- 唤醒锁的使用
- 使用 wakefullBroadcastReceiver 在使用以下过滤器关闭时重新启动服务:
"android.intent.action.BOOT_COMPLETED"
"android.intent.action.QUICKBOOT_POWERON"
- 我自己的意图在应用程序关闭时调用,并且每 10 分钟发出一次警报。
- 以编程方式要求忽略电池优化。
代码
if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
Intent intent = new Intent();
String packageName = getPackageName();
PowerManager powerManager = (PowerManager) getSystemService(POWER_SERVICE);
if (powerManager != null && !powerManager.isIgnoringBatteryOptimizations(packageName)){
intent.setAction(Settings.ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONS);
intent.setData(Uri.parse("package:" + packageName));
startActivity(intent);
}
}
问题
我的手机phone是小米。 BOOT_COMPLETED
和 IGNORE_BATTERY_OPTIMIZATIONS
都不起作用。它们只有在我手动设置权限时才有效。我还向清单文件添加了所需的权限。
那么有没有办法允许这些权限而无需用户手动设置它们?默认情况下,WhatsApp 或 Skype 等应用程序具有这些权限。为什么我不能这样做?
另外,在小米手机上也是如此。它也会发生在所有其他移动设备上吗?
几个月前我偶然发现了同样的问题。问题是所有流行的应用程序,如 WhatsApp 和 Skype,都默认被小米允许,但不是你的应用程序。不知道后台在搞什么deal,感觉对开发者不公平
现在解决,这段代码会导致小米等手机品牌的权限设置,那些定制他们的ROM并为所欲为-
private void specialPermission() {
String alertMessage = "Please allow APP_NAME to always run in the background, else our services can't be accessed when you are in distress.";
final String brand = Build.BRAND;
AlertDialog.Builder builder = new AlertDialog.Builder(mContext);
builder.setMessage(alertMessage);
builder.setPositiveButton("OK", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialogInterface, int i) {
Intent intent = new Intent();
if (brand.equalsIgnoreCase("xiaomi")) {
intent.setComponent(new ComponentName("com.miui.securitycenter",
"com.miui.permcenter.autostart.AutoStartManagementActivity"));
startActivity(intent);
} else if (brand.equalsIgnoreCase("Letv")) {
intent.setComponent(new ComponentName("com.letv.android.letvsafe",
"com.letv.android.letvsafe.AutobootManageActivity"));
startActivity(intent);
} else if (brand.equalsIgnoreCase("Honor")) {
intent.setComponent(new ComponentName("com.huawei.systemmanager",
"com.huawei.systemmanager.optimize.process.ProtectActivity"));
startActivity(intent);
} else if (Build.MANUFACTURER.equalsIgnoreCase("oppo")) {
try {
intent.setClassName("com.coloros.safecenter",
"com.coloros.safecenter.permission.startup.StartupAppListActivity");
startActivity(intent);
} catch (Exception e) {
try {
intent.setClassName("com.oppo.safe",
"com.oppo.safe.permission.startup.StartupAppListActivity");
startActivity(intent);
} catch (Exception ex) {
try {
intent.setClassName("com.coloros.safecenter",
"com.coloros.safecenter.startupapp.StartupAppListActivity");
startActivity(intent);
} catch (Exception exx) {
exx.printStackTrace();
}
}
}
} else if (Build.MANUFACTURER.contains("vivo")) {
try {
intent.setComponent(new ComponentName("com.iqoo.secure",
"com.iqoo.secure.ui.phoneoptimize.AddWhiteListActivity"));
startActivity(intent);
} catch (Exception e) {
try {
intent.setComponent(new ComponentName("com.vivo.permissionmanager",
"com.vivo.permissionmanager.activity.BgStartUpManagerActivity"));
startActivity(intent);
} catch (Exception ex) {
try {
intent.setClassName("com.iqoo.secure",
"com.iqoo.secure.ui.phoneoptimize.BgStartUpManager");
startActivity(intent);
} catch (Exception exx) {
ex.printStackTrace();
}
}
}
}
}
});
AlertDialog dialog = builder.create();
dialog.show();
}
您所要做的就是显示一个对话框,说明您对后台服务的必要性并打开权限设置。尽管它不是一个完整的修复程序,因为 SWIPE KILL,无论如何都会停止服务。