Android 安卓棉花糖6.0+;装置

Android 安卓棉花糖6.0+;装置,android,service,Android,Service,当应用程序进入后台时(按home按钮)。当屏幕关闭时,15-20分钟后,Android M(6.0)手机上的后台服务停止。虽然它可以在手机上使用棒棒糖(5.0)正常工作。当应用程序处于空闲状态时,它对后台服务的使用是有限制的。这不适用于前台服务,因为前台服务对用户来说更为明显 参考资料:安卓M引入了Doze和App Standby,限制后台服务,以保护电池。如何处理打瞌睡可以在官方的android培训手册中找到 编辑: 虽然不是最初问题的一部分,但如果你想支持Android O,你还必须记住新的

当应用程序进入后台时(按home按钮)。当屏幕关闭时,15-20分钟后,Android M(6.0)手机上的后台服务停止。虽然它可以在手机上使用棒棒糖(5.0)正常工作。

当应用程序处于空闲状态时,它对后台服务的使用是有限制的。这不适用于前台服务,因为前台服务对用户来说更为明显


参考资料:

安卓M引入了Doze和App Standby,限制后台服务,以保护电池。如何处理打瞌睡可以在官方的android培训手册中找到

编辑:
虽然不是最初问题的一部分,但如果你想支持Android O,你还必须记住新的后台执行限制。如何做到这一点,可以在官方的android培训手册中找到。

正如您在评论中所说,您已经以START\u STICKY的身份启动了您的服务,即使它在后台的android棉花糖设备中也不起作用

  • 您应该确保测试应用程序的设备包含自动启动权限?如果是,则您必须授予应用程序自动启动权限,否则您的服务无法在后台运行
  • 即使按照上述步骤操作,您的问题仍然没有得到解决,那么我建议按照以下方式使用Alarmmanager启动您的服务
  • 在注册服务的地方使用alarmmanager,如下所示:

    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上解决这个问题。有人请帮我解决这个问题。