2014-12-03 9 views
9

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?

+0

Czy wystarczy nagrywać dostępne aplikacje podczas tej przerwy? – Storo

+0

Potrzebuję tylko nazw aplikacji znajdujących się w tym przedziale. – Kishor

+0

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

Odpowiedz

-1

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.

7

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.

enter image description here

  • Ale aplikacja. może zejść z góry i wrócić do niego w przedziale czasu. (Facebook> Twitter> Twoja aplikacja).

enter image description here

  • 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).

enter image description here

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.

+0

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

+2

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

+0

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

Powiązane problemy