Więc nie jestem pewien, gdzie / jak zaimplementować tę metodę, aby moja usługa działała na pierwszym planie. Obecnie rozpoczynam swoją służbę w innej działalności:
Intent i = new Intent(context, myService.class);
context.startService(i);
A potem w metodzie onCreate () myServices próbuję uruchomić metodę startForeground () ...?
Notification notification = new Notification();
startForeground(1, notification);
Więc tak, jestem trochę zagubiony i nie jestem pewien, jak to zaimplementować.
Odpowiedzi:
Zacząłbym od całkowitego wypełnienia pliku
Notification
. Oto przykładowy projekt demonstrujący użyciestartForeground()
.źródło
1337
?Z głównej aktywności uruchom usługę następującym kodem:
Następnie w swojej usłudze
onCreate()
utworzyłbyś swoje powiadomienie i ustawił je jako pierwszy plan w następujący sposób:źródło
To jest mój kod, aby ustawić usługę na pierwszym planie:
Muszę zbudować powiadomienie przy użyciu PendingIntent, aby móc rozpocząć moją główną aktywność od powiadomienia.
Aby usunąć powiadomienie, po prostu wywołaj stopForeground (true);
Jest wywoływana w onStartCommand (). Proszę zapoznać się z moim kodem na: https://github.com/bearstand/greyparrot/blob/master/src/com/xiong/richard/greyparrot/Mp3Recorder.java
źródło
Intent.FLAG_ACTIVITY_NEW_TASK
nie jest ważny w kontekściePendingIntent
.Rozwiązanie dla Oreo 8.1
Napotkałem pewne problemy, takie jak RemoteServiceException z powodu nieprawidłowego identyfikatora kanału w najnowszych wersjach Androida. Oto jak to rozwiązałem:
Aktywność :
TłoUsługa:
ODPOWIEDNIK JAVA
źródło
ContextCompat.startForegroundService(Context,Intent)
w swojej aktywności, która zrobi właściwą rzecz. ( developer.android.com/reference/android/support/v4/content/… ).setCategory(NotificationCompat.CATEGORY_SERVICE)
zamiast,Notification.CATEGORY_SERVICE
jeśli twój min API jest <21Build.VERSION_CODES.P
(poziom API 28) lub później musi zwrócić się o pozwolenieManifest.permission.FOREGROUND_SERVICE
w celu stosowaniastartForeground()
- patrz developer.android.com/reference/android/app/...Oprócz odpowiedzi RAWA , ten spokój kodu:
Możesz zmienić na:
Jeśli zajrzysz do tej metody, zobaczysz, że ta metoda wykonuje całą pracę sprawdzającą.
źródło
Jeśli chcesz, aby IntentService była usługą pierwszoplanową
wtedy powinieneś zastąpić
onHandleIntent()
to w ten sposóbJak dokonać zgłoszenia?
prosty. Oto
getNotification()
metodaGłębsze zrozumienie
Co się dzieje, gdy usługa staje się usługą pierwszoplanową
Co to jest usługa pierwszoplanowa?
Usługa pierwszoplanowa,
zapewnia, że użytkownik jest aktywnie świadomy tego, że coś dzieje się w tle, dostarczając powiadomienie.
(co najważniejsze) nie jest zabijany przez System, gdy zaczyna brakować pamięci
Przypadek użycia usługi pierwszego planu
Wdrażanie funkcji pobierania utworów w aplikacji muzycznej
źródło
Dodaj podany kod Service class dla "OS> = Build.VERSION_CODES.O" w onCreate ()
Dodaj to uprawnienie w pliku manifestu:
źródło
Obsługa zamiaru startCommand of service przy użyciu.
To wywołanie usunie usługę ze stanu pierwszego planu , umożliwiając jej zabicie, jeśli potrzeba więcej pamięci. Nie zatrzymuje to działania usługi . W tym celu musisz wywołać stopSelf () lub powiązane metody.
Przekazywanie wartości true lub false wskazuje, czy chcesz usunąć powiadomienie, czy nie.
Obsługuj swoje zadanie, gdy funkcja niszczenia jest wywoływana przez stopSelf () .
Utwórz powiadomienie, aby usługa działała na pierwszym planie.
Daj przycisk zatrzymania w powiadomieniu, aby zatrzymać usługę, gdy użytkownik tego potrzebuje.
źródło
Uwaga: jeśli aplikacja jest przeznaczona dla interfejsu API na poziomie 26 lub wyższym, system nakłada ograniczenia na używanie lub tworzenie usług w tle, chyba że sama aplikacja znajduje się na pierwszym planie.
Jeśli aplikacja musi utworzyć usługę pierwszego planu, powinna wywołać aplikację
startForegroundService()
. Ta metoda tworzy usługę w tle, ale metoda sygnalizuje systemowi, że usługa będzie promować się na pierwszy plan.Po utworzeniu usługi usługa musi wywołać jej
startForeground() method within five seconds.
źródło
startForegroundService
metodzieW moim przypadku było zupełnie inaczej, ponieważ nie miałem żadnej aktywności, aby uruchomić usługę w Oreo.
Poniżej znajdują się kroki, które wykonałem, aby rozwiązać ten problem z usługą pierwszego planu -
A potem, aby zainicjować tę usługę, uruchomiłem poniżej cmd -
adb -s "+ serial_id +" shell am startforegroundservice -n com.test.socket.sample / .SocketService
Więc to pomaga mi rozpocząć obsługę bez aktywności na urządzeniach Oreo :)
źródło
Rozwiązanie @mikebertiean prawie załatwiło sprawę, ale miałem ten problem z dodatkowym skrętem - używam systemu Gingerbread i nie chciałem dodawać dodatkowego pakietu tylko po to, aby uruchomić powiadomienie. Wreszcie znalazłem: https://android.googlesource.com/platform/frameworks/support.git+/f9fd97499795cd47473f0344e00db9c9837eea36/v4/gingerbread/android/support/v4/app/NotificationCompatGingerbread.java
potem trafiam na dodatkowy problem - powiadomienie po prostu zabija moją aplikację po jej uruchomieniu (jak rozwiązać ten problem: Android: Jak uniknąć kliknięcia Powiadomienia wywołuje onCreate () ), więc w sumie mój kod w usłudze wygląda tak (C # / Xamarin):
źródło