Chciałbym mieć jedną aplikację działającą w tle, która wie, kiedy jest uruchomiona którakolwiek z wbudowanych aplikacji (wiadomości, kontakty itp.).
Więc moje pytania to:
Jak uruchomić aplikację w tle.
Skąd moja aplikacja działająca w tle może wiedzieć, jaka aplikacja jest aktualnie uruchomiona na pierwszym planie.
Mile widziane będą odpowiedzi osób z doświadczeniem.
Odpowiedzi:
W odniesieniu do „2. Skąd moja aplikacja w tle może wiedzieć, jaka aplikacja jest aktualnie uruchomiona na pierwszym planie”.
NIE używaj tej
getRunningAppProcesses()
metody, ponieważ zwraca to wszelkiego rodzaju śmieci systemowe z mojego doświadczenia, a otrzymasz wiele wyników, które mająRunningAppProcessInfo.IMPORTANCE_FOREGROUND
. UżyjgetRunningTasks()
zamiast tegoOto kod, którego używam w mojej usłudze, aby zidentyfikować bieżącą aplikację na pierwszym planie, jest naprawdę łatwy:
To wszystko, możesz łatwo uzyskać dostęp do szczegółów aplikacji / aktywności na pierwszym planie:
Wymaga to dodatkowego zezwolenia w działaniu menifestu i działa doskonale.
źródło
getRunningTasks()
jest przestarzały w API 21 (Lollipop) - developer.android.com/reference/android/app/ ...Musiałem znaleźć właściwe rozwiązanie na własnej skórze. poniższy kod jest częścią cyanogenmod7 (modyfikacje tabletu) i jest testowany na Androidzie 2.3.3 / gingerbread.
metody:
mam nadzieję, że to rozwiąże ten problem w całym zakresie (:
źródło
mActivityManager.getRunningTasks(1).get(0).topActivity
?Wypróbuj następujący kod:
Nazwa procesu to nazwa pakietu aplikacji działającej na pierwszym planie. Porównaj go z nazwą pakietu swojej aplikacji. Jeśli jest taki sam, oznacza to, że aplikacja działa na pierwszym planie.
Mam nadzieję, że to odpowiada na twoje pytanie.
źródło
Od Lollipopa to się zmieniło. Proszę znaleźć poniższy kod, zanim ten użytkownik będzie musiał przejść Ustawienia -> Bezpieczeństwo -> (Przewiń w dół do ostatniego) Aplikacje z dostępem do użytkowania -> Nadaj uprawnienia naszej aplikacji
źródło
W przypadkach, gdy musimy sprawdzić z naszej własnej usługi / wątku w tle, czy nasza aplikacja jest na pierwszym planie, czy nie. Tak to zaimplementowałem i działa dobrze:
Teraz, aby sprawdzić z innych klas, czy aplikacja jest na pierwszym planie, czy nie, po prostu zadzwoń:
Aktualizacja (jak wskazała SHS ):
Nie zapomnij zarejestrować się do wywołań zwrotnych w
onCreate
metodzie klasy aplikacji .źródło
Aby określić aplikację pierwszoplanową, której możesz użyć do wykrywania aplikacji pierwszego planu, możesz użyć https://github.com/ricvalerio/foregroundappchecker . Używa różnych metod w zależności od wersji Androida urządzenia.
Jeśli chodzi o usługę, repozytorium zapewnia również potrzebny do niej kod. Zasadniczo pozwól Android Studio stworzyć usługę za Ciebie, a następnie onCreate dodaj fragment kodu korzystający z appChecker. Będziesz jednak musiał poprosić o pozwolenie.
źródło
Biorąc pod uwagę, że
getRunningTasks()
jest to przestarzałe igetRunningAppProcesses()
nie jest wiarygodne, zdecydowałem się połączyć 2 podejścia wymienione w StackOverflow:źródło
ActivityManager klasa jest odpowiednim narzędziem, aby zobaczyć, jakie procesy są uruchomione.
Aby działać w tle, zazwyczaj chcesz użyć usługi .
źródło
To zadziałało dla mnie. Ale podaje tylko nazwę menu głównego. Oznacza to, że jeśli użytkownik otworzył ekran Ustawienia -> Bluetooth -> Nazwa urządzenia, RunningAppProcessInfo nazywa to po prostu Ustawieniami. Nie mogę wydobyć furthura
źródło
Zrób coś takiego:
źródło
W Lollipop i nowszych:
Dodaj do mainfest:
I zrób coś takiego:
źródło
W ten sposób sprawdzam, czy moja aplikacja jest na pierwszym planie. Uwaga Używam AsyncTask zgodnie z sugestią oficjalnego Androida dokumentacją
`
i wykonaj AsyncTask w ten sposób.
new CheckIfForeground().execute();
źródło
Połączyłem dwa rozwiązania w jedną metodę i działa u mnie na API 24 i na API 21. Inne nie testowałem.
Kod w Kotlinie:
iw Manifest
źródło