2017-06-08 27 views
20

Używam klasy Service na systemie Android O OS.Usługa Context.startForegroundService() nie wywoływała wtedy Service.startForeground()

Mam zamiar użyć Service w tle.

Zgodnie z zaleceniami Androida usługa startService powinna korzystać z usługi startForegroundService.

Jeśli używasz startForegroundService The Service rzuca Context.startForegroundService() nie wywołujemy Service.startForeground() błąd.

Co jest nie tak z tym?

+1

proszę umieszczać odpowiednią część kodu i twój dziennik błędów tutaj. – Opiatefuchs

+0

IOW, proszę podać [mcve]. Obejmuje to cały ślad stosu Java i kod powodujący awarię. – CommonsWare

Odpowiedz

14

Z Dokumentów Google na Android 8.0 behavior changes:

System umożliwia aplikacjom zadzwonić Context.startForegroundService() nawet wtedy, gdy aplikacja jest w tle. Jednak aplikacja musi wywołać metodę startForeground() tej usługi w ciągu pięciu sekund po utworzeniu usługi.

Rozwiązanie: połączeń startForeground w onCreate() za służbę, którą używasz Context.startForegroundService().

Zobacz także: Background Execution Limits dla Androida 8.0 (Oreo)

+4

Zrobiłem to w metodzie 'onStartCommand', ale nadal otrzymuję ten błąd. W mojej 'MainActivity' nazwałem' startForegroundService (intent) '. Może usługa jest uruchamiana zbyt wolno. Myślę, że limit pięciu sekund nie powinien istnieć, zanim będą mogli obiecać, że usługa zostanie uruchomiona natychmiast. –

8

Zadzwoniłem ContextCompat.startForegroundService(this, intent) uruchomić usługę następnie

W służbie onCreate

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

     if (Build.VERSION.SDK_INT >= 26) { 
      String CHANNEL_ID = "my_channel_01"; 
      NotificationChannel channel = new NotificationChannel(CHANNEL_ID, 
        "Channel human readable title", 
        NotificationManager.IMPORTANCE_DEFAULT); 

      ((NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE)).createNotificationChannel(channel); 

      Notification notification = new NotificationCompat.Builder(this, CHANNEL_ID) 
        .setContentTitle("") 
        .setContentText("").build(); 

      startForeground(1, notification); 
     } 
} 
+2

Ja też. Ale ciągle dostaję tego błędu od czasu do czasu. Może Android nie może zagwarantować, że zadzwoni na 'onCreate' w 5 sekund. Powinni więc przeprojektować go, zanim zmusi nas do przestrzegania zasad. –

+1

Nazwałem startForeground w onStartCommand(), a ja od czasu do czasu dostawałem ten błąd. Przeniosłem go do OnCreate i nie widziałem go od tego czasu (palce skrzyżowania). – Tyler

+2

Spowoduje to utworzenie powiadomienia lokalnego w Oreo, mówiącego "Aplikacja APP_NAME jest uruchomiona. Kliknij, aby zamknąć lub wyświetlić informacje". Jak przestać wyświetlać to powiadomienie? – Artist404

0

https://developer.android.com/reference/android/content/Context.html#startForegroundService(android.content.Intent)

Podobne do StartService (Intent), ale z im niejawna obietnica, że ​​usługa wywoła funkcję startForeground (int, android.app.Notification) po uruchomieniu . Usługa ma czas porównywalny do przedziału ANR, aby to zrobić, w przeciwnym razie system automatycznie zatrzyma usługę i zadeklaruje ANR aplikacji.

W odróżnieniu od zwykłej metody startService (Intent), ta metoda może być używana w dowolnym momencie pod numerem , niezależnie od tego, czy aplikacja obsługująca usługę znajduje się na pierwszym planie w stanie .

upewnij się wywołać Service.startForeground(int, android.app.Notification) na onCreate(), dzięki czemu zapewniają to będzie called..if masz jakiś warunek, który może uniemożliwić to robić, to lepiej wyłączyć za pomocą normalnego Context.startService(Intent) i zadzwoń pod numer Service.startForeground(int, android.app.Notification).

Wygląda na to, że Context.startForegroundService() dodaje watchdog, aby upewnić się, że zadzwoniłeś na Service.startForeground(int, android.app.Notification), zanim został zniszczony ...

+0

Moje usługi alarmowe używają usługi AlarmManager do uruchomienia usługi o określonej godzinie, a następnie sprawdzania dostępności aktualizacji w Internecie. Teraz zmusiłem do użycia startForegroundService(), ponieważ w przeciwnym razie nie uruchomię Androida O ("W/ActivityManager: Background start not allowed: service Intent") - zobacz https://stackoverflow.com/questions/45016174/android- o-and-background-limits-zapobiega-zwykłemu alarmowi-powiadomieniu. Jak rozwiązać ten problem? W moim przypadku nie zawsze chcę wysyłać powiadomienia. Jeśli nie ma internetu, po prostu chcę przestać działać i nie pokazywać niczego do użytku. –

0

Upewnij się, że wszystkie ścieżki kod wywołuje metodę startForeground, na przykład kodu może wygenerować wyjątek od metody onCreate swojej służby, które uniemożliwiają startForeground od miano

@Override 
    public void onCreate() { 
try{ 
} 
catch(Exception e) 
{ 
} 
finally{ 
    startForeground(1, notificationbuilder.build()); 

} 
    } 
Powiązane problemy