2014-11-03 19 views
6

Użyłem funkcji API getRunningTask w jednej z moich aplikacji do znalezienia aplikacji na pierwszym planie. Ten interfejs API jest przestarzały od czasu Lollipop. Po tym wycofaniu wolałem API getRunningAppProcess wraz z Importance_Foreground. Wykluczyłem także REASON_SERVICE i REASON_PROVIDER z tej listy. Odfiltrowałem aplikacje systemowe oparte na logice, która działała doskonale. Problem polega na tym, że jeśli aplikacja A znajduje się na pierwszym planie, otrzymuję aplikację B jako skok. Takie podejście jest obecnie wątpliwe. Czy jest jakaś inna alternatywa dla API getRunningTask? Czy też brakuje mi jakiejś prostej rzeczy w obecnym podejściu. Pomóżcie chłopaki.Czy istnieje alternatywa dla getRunningTask API

+0

To naprawdę zależy od celu dla informacji. Jeśli jest to uzasadnione, prawdopodobnie istnieją alternatywy, ale zależą one od tego, co dokładnie próbujesz osiągnąć. –

Odpowiedz

30

Na podstawie odpowiedzi na this question

String getTopPackage(){ 
    long ts = System.currentTimeMillis(); 
    UsageStatsManager mUsageStatsManager = (UsageStatsManager)getSystemService("usagestats"); 
    List<UsageStats> usageStats = mUsageStatsManager.queryUsageStats(UsageStatsManager.INTERVAL_BEST, ts-1000, ts); 
    if (usageStats == null || usageStats.size() == 0) { 
     return NONE_PKG; 
    } 
    Collections.sort(usageStats, mRecentComp); 
    return usageStats.get(0).getPackageName(); 
} 

To mRecentComp:

static class RecentUseComparator implements Comparator<UsageStats> { 

    @Override 
    public int compare(UsageStats lhs, UsageStats rhs) { 
     return (lhs.getLastTimeUsed() > rhs.getLastTimeUsed()) ? -1 : (lhs.getLastTimeUsed() == rhs.getLastTimeUsed()) ? 0 : 1; 
    } 
} 

Uprawnienie to jest potrzebne:

<uses-permission xmlns:tools="http://schemas.android.com/tools" 
    android:name="android.permission.PACKAGE_USAGE_STATS" 
    tools:ignore="ProtectedPermissions" /> 

i trzeba będzie autoryzację użytkownika, aby zażądać statystyki, użyj tego, aby skierować użytkownika do strony ustawień:

Intent intent = new Intent(Settings.ACTION_USAGE_ACCESS_SETTINGS); 
startActivity(intent); 

I można sprawdzić, czy masz już uprawnienia takiego:

public static boolean needPermissionForBlocking(Context context) { 
    try { 
     PackageManager packageManager = context.getPackageManager(); 
     ApplicationInfo applicationInfo = packageManager.getApplicationInfo(context.getPackageName(), 0); 
     AppOpsManager appOpsManager = (AppOpsManager) context.getSystemService(Context.APP_OPS_SERVICE); 
     int mode = appOpsManager.checkOpNoThrow(AppOpsManager.OPSTR_GET_USAGE_STATS, applicationInfo.uid, applicationInfo.packageName); 
     return (mode != AppOpsManager.MODE_ALLOWED); 
    } catch (PackageManager.NameNotFoundException e) { 
     return true; 
    } 
} 
+0

Dzięki. Wszystkie wspomniane rzeczy działają jak urok. Ale jeszcze jedno, czy mogę użyć dowolnego obserwatora treści, aby wiedzieć, kiedy użytkownik je wyłącza lub włącza? Przyjmuję odpowiedź wkrótce po otrzymaniu odpowiedzi na to. – madhu

+0

Sądzę, że możesz spróbować tego http://stackoverflow.com/questions/6896746/android-is-there-a-broadcast-action-for-volume-changes. –

+0

Jeśli to nie zadziała, możesz użyć funkcji needPermission w mojej odpowiedzi, aby sprawdzić, czy jest włączona. –

3

uzyskać listę RunningAppProcessInfo przez ActivityManager.getRunningAppProcesses(). Wybierz RuningAppProcessInfo, z którego importance == RunningAppProcessInfo.IMPORTANCE_FOREGROUND i którego processState == ActivityManager.START_TASK_TO_FRONT. (Były to proste, to ostatnie jest trudne, ponieważ odbicie jest to konieczne)

Zobacz moją odpowiedź na to pytanie getRunningTasks doesn't work in Android L

+2

Nie działa w wersji wstępnej Androida M , Niestety. – Sam

+0

Tak, jest. Powinniśmy znaleźć nowe podejście. – KNaito

Powiązane problemy