奥利奥(Oreo)后台服务限制了START_STICKY问题

时间:2019-01-26 13:38:54

标签: android service android-8.0-oreo foreground-service

在android oreo之后,关于服务使用方面有一些限制。我不明白限制如何影响代码?例如,如果我通过startService函数启动服务,并在startcommand函数中返回Start_STICKY,则kill后服务将重新启动。我在这里看不到有关android 8的任何问题。我可以在后台服务中监听位置更新。这里的限制是什么?返回start_sticky足以重新创建和。再次运行服务?

2 个答案:

答案 0 :(得分:0)

最近3天,我一直在研究此主题。最后,我从android开发人员网站上了解了android 8后台服务限制,如果要在后台运行服务,则只有一件事很重要,那么您应该在应用中显示通知在5秒内,否则您将获得非法异常 这是实现

  @Override
    public void onCreate() {
        super.onCreate();
        startInForeground();
    }

 private void startInForeground() {
        Intent notificationIntent = new Intent(this, SplashScreenActivity.class);
        PendingIntent pendingIntent=PendingIntent.getActivity(this,0,notificationIntent,0);
        NotificationCompat.Builder builder = new NotificationCompat.Builder(this,"some_channel_id")
                .setSmallIcon(R.drawable.ic_motion_new)
                .setContentTitle("Sure")
                .setContentText("Local call notification")
                .setTicker("TICKER")
                .setContentIntent(pendingIntent);
        Notification notification=builder.build();
        NotificationChannel channel = null;
        if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.O) {
            channel = new NotificationChannel("local_call_notification", "Local Call", NotificationManager.IMPORTANCE_MIN);
            channel.setDescription("Local Call Notification");
            NotificationManager notificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
            notificationManager.createNotificationChannel(channel);

        }
        startForeground(2, notification);

        NotificationManager notificationManager= (NotificationManager) this.getSystemService(Context.NOTIFICATION_SERVICE);
        notificationManager.cancel(2);
    }

启动服务

Intent startServiceIntent = new Intent(context,xyz.class);

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
    context.startForegroundService(startServiceIntent);
} else {
    context.startService(startServiceIntent);
}

答案 1 :(得分:0)

根据我的测试,当service在后台运行时,如果手动杀死应用程序,服务会通过设置start_sticky重新启动。但是当服务在后台运行一段时间后,无论是否设置了Start_Sticky参数,系统都会自动杀死该服务。还有一个现象是我在Android 10上运行时,无论我怎么设置参数,服务都不会自动重启。