Android 安卓棉花糖6.0+;装置
当应用程序进入后台时(按home按钮)。当屏幕关闭时,15-20分钟后,Android M(6.0)手机上的后台服务停止。虽然它可以在手机上使用棒棒糖(5.0)正常工作。当应用程序处于空闲状态时,它对后台服务的使用是有限制的。这不适用于前台服务,因为前台服务对用户来说更为明显Android 安卓棉花糖6.0+;装置,android,service,Android,Service,当应用程序进入后台时(按home按钮)。当屏幕关闭时,15-20分钟后,Android M(6.0)手机上的后台服务停止。虽然它可以在手机上使用棒棒糖(5.0)正常工作。当应用程序处于空闲状态时,它对后台服务的使用是有限制的。这不适用于前台服务,因为前台服务对用户来说更为明显 参考资料:安卓M引入了Doze和App Standby,限制后台服务,以保护电池。如何处理打瞌睡可以在官方的android培训手册中找到 编辑: 虽然不是最初问题的一部分,但如果你想支持Android O,你还必须记住新的
参考资料:安卓M引入了Doze和App Standby,限制后台服务,以保护电池。如何处理打瞌睡可以在官方的android培训手册中找到 编辑:
虽然不是最初问题的一部分,但如果你想支持Android O,你还必须记住新的后台执行限制。如何做到这一点,可以在官方的android培训手册中找到。正如您在评论中所说,您已经以START\u STICKY的身份启动了您的服务,即使它在后台的android棉花糖设备中也不起作用
AlarmManager alarmMgr = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
Intent intent = new Intent(context,ServiceStarter.class);
PendingIntent alarmIntent = PendingIntent.getBroadcast(context, 1545, intent, 0);
alarmMgr.set(AlarmManager.RTC,
System.currentTimeMillis() + 5000, alarmIntent);
然后在ServiceStarter广播接收器中执行以下操作
public class ServiceStarter extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
if (!ConstantData.isServiceRunning(YourService.class , context)){ //check service is running or not
context.startService(new Intent(context , YourService.class));
}
else{
Log.e("service-->>" , "service already running");
}
try {
//set alarm for next 5 seconds...this will set alarm for every next 5 seconds
AlarmManager alarmMgr = (AlarmManager)context.getSystemService(Context.ALARM_SERVICE);
Intent intent2 = new Intent(context, ServiceStarter.class);
PendingIntent alarmIntent = PendingIntent.getBroadcast(context, 1545, intent2, 0);
alarmMgr.set(AlarmManager.RTC,
System.currentTimeMillis() + 5000, alarmIntent);
} catch (Exception e) {
}
}
}
ConstantData.isServiceRunning()方法:-
public static boolean isServiceRunning(Class<?> serviceClass, Context context) {
ActivityManager manager = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);
for (ActivityManager.RunningServiceInfo service : manager.getRunningServices(Integer.MAX_VALUE)) {
if (serviceClass.getName().equals(service.service.getClassName())) {
return true;
}
}
return false;
}
公共静态布尔IServiceRunning(类serviceClass,上下文){
ActivityManager=(ActivityManager)context.getSystemService(context.ACTIVITY_服务);
对于(ActivityManager.RunningServiceInfo服务:manager.getRunningServices(Integer.MAX_值)){
if(serviceClass.getName().equals(service.service.getClassName())){
返回true;
}
}
返回false;
}
上述代码将每隔5秒触发alarmmanager,并检查服务是否正在运行。如果服务正在运行,它将什么也不做,如果服务停止,它将再次启动服务。当设备内存不足时,它会“停止”以释放内存。请阅读Android M的后台限制,N等等。对你的代码提出疑问,你在哪台设备上测试你的应用程序?我测试的设备是HTC U Play(6.0)有4 GB内存。没有任何其他应用程序在手机上运行。所以内存不足不是问题。还有一件事,它也发生在其他6.0+设备上。您应该在onStartCommand()中返回
START\u STICKY
。即使由于内存不足或其他原因被操作系统停止,它也会重新启动您的服务。上面的文档解释了“Android 8.0(API级别26)对应用程序在后台运行时的功能施加了限制”。我在安卓6.0上遇到了问题。它帮助我解决了这个问题。非常感谢!!这不会解决实际问题,而是试图强行启动服务,在启动过程中消耗大量电池电量。它也将停止在安卓8和更高版本上工作。是的,我知道,但这是唯一能在所有设备上工作的方法。这将适用于大多数设备,即使是Mi设备,也适用于vivo和oppo设备,它们在自定义操作系统中包含自己的优化机制。如果您有任何更好的解决方案,将在所有设备上工作,那么请让我知道@Sanderth这不会在每台设备上都起作用,从BroadcastReceiver
调用上下文。在Android 8及更高版本上,startService
将导致IllegalStateException
。更好的解决方案在很大程度上取决于您试图实现的目标,让您自己的服务一直在后台运行已经不可能了。@JaydipKalkani我几天前在Android 6.0上测试过它,效果很好。今天在7.0上进行了测试,但服务在7.0和8.0上停止。上述主题对我也有很大帮助。我已经在上面的主题中添加了许多最新的权限请求\u忽略\u电池\u优化。我做的第二个改变是通过setAndAllowHileidle设置alarm。现在每部手机都可以用了。谢谢在5.0、6.0、7.0版本的手机上进行了测试,工作正常。但是仍然不能在安卓8.0上工作!!你最初的问题是为什么它停止在安卓6上工作,但我已经更新了我的答案,提供了为什么它不能在安卓8上工作的信息。我无法在安卓8.0上解决这个问题。有人请帮我解决这个问题。