Фоновая служба Oreo ограничивает START_STICKY проблему - PullRequest
0 голосов
/ 26 января 2019

После android oreo есть некоторые ограничения по использованию сервиса. Я не мог понять, как ограничения влияют на код? Например, если я запускаю службу с помощью функции startService и возвращаю Start_STICKY в функцию startcommand, служба будет перезапущена после kill. Я не вижу здесь никаких проблем с Android 8. Я могу прослушивать местоположение, обновленное в фоновой службе. Какие здесь ограничения? Возвращение start_sticky достаточно для воссоздания и. запустить сервис снова?

1 Ответ

0 голосов
/ 26 января 2019

я занимался этой темой в течение последних 3 дней. Наконец, я прочитал об ограничении фонового обслуживания для Android 8 на веб-сайте разработчика Android, и важно только одно, если вы хотите запускать свой сервис в фоновом режиме, вы должны показать уведомление в своем приложении.в течение 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);
}
...