Chcę się dowiedzieć, która lista apps
jest dostępna dla użytkownika w określonym przedziale czasu (np. 5 min) z pracy w tle? Czy jest to możliwe w przypadku niezrootowanego telefonu android
? Jeśli to możliwe, jestem bardzo zainteresowany poznaniem odpowiedzi, ponieważ będzie to świetna wiedza na temat Androida.Jak znaleźć listę aplikacji dostępnych dla użytkownika w interwale za pomocą zadania w tle?
Odpowiedz
Tak. Jest to możliwe. Twoja usługa musi być uruchamiana co 5 sekund. W tej usłudze musisz napisać logikę dla dowolnej aplikacji, do której ma dostęp użytkownik. Aby uzyskać uruchomione aplikacje, musisz użyć klasy ActivityManager.
Update:
w Android 5,0 alternatywa getRecentTasks() metoda getAppTasks.
Przykładowy kod:
private void listTasks() throws PackageManager.NameNotFoundException {
ActivityManager mgr = (ActivityManager)getSystemService(Context.ACTIVITY_SERVICE);
List<ActivityManager.AppTask> tasks = mgr.getAppTasks();
String packagename;
String label;
for (ActivityManager.AppTask task: tasks){
packagename = task.getTaskInfo().baseIntent.getComponent().getPackageName();
label = getPackageManager().getApplicationLabel(getPackageManager().getApplicationInfo(packagename, PackageManager.GET_META_DATA)).toString();
Log.v(TAG,packagename + ":" + label);
}
}
Original Odpowiedź:
Wprowadzenie
Klasa ActivityManager oferuje dwie metody, która zwraca taką informację. Wybór metody getRecentTasks lub getRunningTasks byłby odpowiedni, ponieważ lista zwróconych zadań i tak nie jest naszym celem. ale, Będzie on używany jako punkt odniesienia na drodze do ustalenia pożądanej listy.
Przykładowy kod:
ActivityManager activityManager = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE);
List<RecentTaskInfo> activitys = activityManager.getRecentTasks(Integer.MAX_VALUE, ActivityManager.RECENT_IGNORE_UNAVAILABLE);
for (int i = 0; i < activitys.size(); i++) {
RecentTaskInfo activity = activitys.get(i);
activity.baseIntent.getComponent().getPackageName();
}
Filtrowanie: Lista ta obejmuje wszystkie rodzaje zadań, w tym zadań systemowych.
Przykładowy kod:
if (activity.baseIntent.getCategories().contains(Intent.CATEGORY_LAUNCHER)) {
// This is an application.
getPackageManager()
.getApplicationLabel(getPackageManager()
.getApplicationInfo(activity.baseIntent.getComponent()
.getPackageName(), PackageManager.GET_META_DATA)); // application name
}
Jest to ta sama lista, która będzie wyświetlana na długo naciskając przycisk home.
Streszczenie Podejście: (Wyjaśnienie przychodzi później)
Aby ustalić żądaną listę w określonym czasie, że będziemy call (okres). Lista ostatnich zadań zostanie wyświetlona na początku okresu i po każdym mniejszym okresie w okresie , który wywołujemy jako interwał.
Najnowsze aplikacje. lista pobrana po pierwszym interweniowaniu będzie zawierać trzy typy aplikacji: . Stare aplikacje, które nie są w naszym interesie, Nowo uruchomione i ponownie uruchomione aplikacje. Powodem wyboru abstrakcyjnego podejścia jest wykrywanie aplikacji ponownie uruchomionych.
wykrywania nowych uruchomiony Apps:
te są aplikacje. które po prostu nie pojawiły się na pierwszej otrzymanej pobranej liście. (przed okresem).
Objaśnienie na przykładach, dlaczego to podejście:
- Byłby to świetny pomysł, aby rozważyć każdą aplikację. pojawił się przed Twoją aplikacją. na później pobranej liście ponownie uruchomiona aplikacja. od kiedy rozpoczęliśmy operację, która pochodzi z aplikacji, Twojej aplikacji. był na szczycie listy.
- Ale aplikacja. może zejść z góry i wrócić do niego w przedziale czasu. (Facebook> Twitter> Twoja aplikacja).
- W późniejszym liście pobranego inna aplikacja. może dostać się na górę. wzięcie tego jako odniesienia również zakończy się niepowodzeniem z tego samego powodu, co twoja aplikacja. nie powiodło się jako odniesienie.
Winning Podejście:
Lista pobrane przed przerwą będzie odniesienie do listy pobranego po przerwie. ponownie uruchomione aplikacje. byłyby aplikacje. pojawił się przed pierwszą uporządkowaną podlistą (fosl).
Wszystkie aplikacje. zanim fosl zostaną ponownie uruchomione nie tylko What's app. I, Można to łatwo udowodnić. Nie ma sposobu, aby zmienić kolejność aplikacji na ftl w taki sposób, że niektóre z nich mogły zostać ponownie uruchomione bez zmiany fosl (zyskaj większe, aby dodać więcej aplikacji). możesz to ćwiczyć.
Podejście fosl też zadziała, nawet jeśli użytkownik usunął niektóre aplikacje. z listy ręcznie w przedziale. tylko usunięte aplikacje nie zostaną wykryte, jeśli nie zostały wykryte w poprzednim interwale. ale nie wpłynie to na podejście fosla dla pozostałych na liście. to samo, jeśli użytkownik wyczyścił całą listę, tylko wyczyszczone aplikacje. nie zostaną wykryte, a nie te uruchomione później w tym samym przedziale.
Dlaczego interwały?, ponieważ przez tak długi czas użytkownik może otwierać i ponownie uruchamiać aplikacje. następnie wyczyść listę lub usuń niektóre.
Drobne interwały również utrudniłyby użytkownikowi otwieranie dowolnej najwyższej podlisty z tą samą kolejnością, co jest jedyną słabością podejścia opartego na foslu.
Przykładowy kod: (fosl)
public int getIndexOfFirstAppBeforeFOSL(ArrayList<App> recentApps) {
int i=previousRecentApps.size()-1, j = recentApps.size()-1;
for (; i>=0 && j>=0 ; i--) {
App app = previousRecentApps.get(i);
if (app.equals(recentApps.get(j))) {
j--;
} else {
// this application got re-launched and therefore it changed it place in list.
// or removed manually by user.
}
}
return j;
}
stworzyłem GitHub project dla aplikacji. sprawdź to i zgłaszaj ewentualne błędy.
Brak wykrycia jednej lub dwóch aplikacji ze względu na słabość, o której wspomnieliśmy, naprawdę chce wpłynąć na wynik badania, jaki otrzymujesz ze zbierania aplikacji. uruchamianie z dużej liczby użytkowników. jeśli to, co robisz w każdym razie. W przeciwnym razie Twoja aplikacja. często można uzyskać nową uruchomioną aplikację. i powiadomić o tym użytkownika.
Sprawdź to, jest późna noc. Dokonałem ostatnich minut modyfikacji projektu kodu. wszystko dobrze, jak mogę powiedzieć. Podejście teoretycznie wygląda idealnie. zgłoś mi błędy w kodzie projektu. Naprawię. ciekawe pytanie i tak. – hasan83
Zauważ, że twoja technika nie będzie działać tak jak w systemie Android 5.0, gdy 'getRecentTasks()' nie będzie już robić tego, czego potrzebujesz. – CommonsWare
Tak, to prawda. ale nadal będzie działać dla 80% urządzeń przez około rok, a mniej procent później. Zaktualizuję moją odpowiedź, jeśli pojawi się rozwiązanie w wersji 5.0 lub nie. – hasan83
- 1. Zadania w tle dla aplikacji
- 2. Android: uruchamianie zadania w tle za pomocą aplikacji AlarmManager
- 3. Jak przetestować zadania w tle (Sidekiq) za pomocą Rspec?
- 4. Jak uzyskać listę dostępnych plików za pomocą wget lub curl?
- 5. Jak mogę uruchomić ciągłe zadanie w tle za pomocą Sidekiq?
- 6. Jak znaleźć pełną listę dostępnych kolejek pbs torque?
- 7. Lista dostępnych generatorów w aplikacji szyny
- 8. Zadania, zadania Cron lub Backendy dla aplikacji
- 9. Jak uzyskać listę raportów dostępnych w wystąpieniach usług raportowania
- 10. Zapisywanie w tle za pomocą danych podstawowych?
- 11. uzyskać listę dostępnych wyliczenia
- 12. Jak uzyskać listę dostępnych portów szeregowych w moim komputerze za pomocą Java?
- 13. Symulacja zadania w tle na AppHarbor
- 14. Zadania w tle w Androidzie do synchronizacji z usługą sieciową
- 15. Selenum.Chrome Gdzie mogę znaleźć listę wszystkich dostępnych argumentów ChromeOption? C#
- 16. Jak znaleźć listę procesów za pomocą konkretnego modułu jądra?
- 17. Jak przedłużyć listę dostępnych lokalizacji Java?
- 18. Uzyskiwanie ról użytkownika w aplikacji serwletu za pomocą placków klawiszowych
- 19. Pobieranie w tle iOS w tle dla lokalnych powiadomień
- 20. Jak uzyskać listę dostępnych folderów na koncie pocztowym za pomocą JavaMail
- 21. Jak otworzyć profil użytkownika na Twitterze za pomocą aplikacji Twitter za pomocą łącza w mobilnym Safari?
- 22. Jak przesłać zadanie w tle za pomocą afnetworking
- 23. Jak mogę znaleźć kraj użytkownika za pomocą geolokacji HTML5?
- 24. Jak mogę wyświetlić listę dostępnych algorytmów szyfrowania?
- 25. Jak uzyskać listę wszystkich dostępnych poleceń powłoki?
- 26. Eclipse jak wyświetlić bezpośrednio listę dostępnych funkcji
- 27. Uruchamianie zadania w wątku w tle okresowo w iOS
- 28. Jak znaleźć liczbę elementów za pomocą jQuery
- 29. Lista dostępnych czcionek w PHP
- 30. Zadania w tle niezwiązane z żadnym klientem w Meteorzie
Czy wystarczy nagrywać dostępne aplikacje podczas tej przerwy? – Storo
Potrzebuję tylko nazw aplikacji znajdujących się w tym przedziale. – Kishor
Czy sprawdziłeś moją odpowiedź? Aplikacja ma jednak błąd. nie w podejściu, ale ulega zniszczeniu po otwarciu wielu programów. wywołanie metody z usługi rozwiązałoby problem. i wysłać bezpośrednio do usługi internetowej. lub zapisywanie go na urządzeniu gdzie indziej. moja aplikacja wyświetla je w widoku listy do celów testowych. to zgubi się w dowolny sposób z interfejsu użytkownika. nawet jeśli mamy usługę. musimy je przechowywać. – hasan83