2014-11-23 13 views
20

Ich verwende den folgenden Code, um den Aktivitätsnamen der Vordergrund-App in der Variablen foregroundTaskPackageName abzurufen. Es funktioniert auf allen Betriebssystemversionen zwischen 4.1 und 4.4, funktioniert aber nicht in Android 5.0 Lollipop.Name der Vordergrundaktivität kann nicht in Android Lollipop 5.0 abgerufen werden.

Kann mir jemand helfen, was sich in 5.0 Lollipop geändert hat? In Lollipop - der Text, den ich für foregroundTaskPackageName bekomme, ist nur 'Launcher3'. Ich benutze den Genymotion Emulator.

ActivityManager am = (ActivityManager) getSystemService(ACTIVITY_SERVICE); 
RunningTaskInfo foregroundTaskInfo = am.getRunningTasks(1).get(0); // get 
                     // list 
                     // of 
                     // running 
                     // tasks 
String foregroundTaskAppName = null; 
String foregroundTaskPackageName = foregroundTaskInfo.topActivity 
       .getPackageName(); 
+0

ich mich gefragt, ob Sie in der Lage waren, die topActivity mit dem neuen UsageStatsManager für Android L. abrufen Wenn mir ja bitte wissen, wie. Ein Beispielcode wäre auch nützlich. Vielen Dank. – user3144836

+0

@ user3144836: Können Sie den Weg zu TopActivity finden? – venkat

+0

@venkat: Nein. Habe noch nicht in Android 5.0 Lollipop – user3144836

Antwort

9

Sie müssen die neuen UsageStatsManager und rufen seine queryUsageStats Methode verwenden, um die Geschichte von Aktivitäten ins Leben gerufen zu bekommen. Bitte beachten Sie, dass der Benutzer Zugriff auf die Nutzungsstatistik in den Geräteeinstellungen unter Sicherheit-> Apps mit Nutzungszugang erhalten muss.

Links:

UsageStatsManager documentation

queryUsageStats method documentation

5

getRunningTasks()

Diese Methode wurde in API-Ebene veraltet 21. Ab LOLLIPOP, diese Methode ist nicht mehr auf Anwendungen von Drittanbietern: die Einführung von dokumentenzentrierten recents Mittel es kann Person Informationen an den Anrufer lecken. Für Abwärtskompatibilität wird es immer noch eine kleine Teilmenge seiner Daten zurückgeben: mindestens die eigenen Aufgaben des Aufrufers, und möglicherweise einige andere Aufgaben wie zu Hause, die bekannt sind, nicht empfindlich zu sein.

28

Dieses auf Lollipop funktioniert für mich (21):

ActivityManager manager = (ActivityManager)mContext.getSystemService(Context.ACTIVITY_SERVICE); 

    List<ActivityManager.RunningAppProcessInfo> tasks = manager.getRunningAppProcesses(); 

    Log.i("current_app",tasks.get(0).processName); 
+0

yesssssssssssssssssssssss – Alexis

+0

Gibt es eine Möglichkeit, die Top-Aktivität mit diesem Ansatz zu erhalten? – venkat

+0

Weil ich für eine genaue Aktivität von einer Anwendung benachrichtigt werden möchte. – venkat

2

eine zur Verfügung, aber nicht beste Weg ist, die Zugänglichkeit zu verwenden.

Deklarieren Sie eine Zugänglichkeit Service in AndroidManifest XML-Datei

<service 
      android:name=".MyAccessibilityService" 
      android:label="@string/accessibility_service_label" 
      android:permission="android.permission.BIND_ACCESSIBILITY_SERVICE" > 
      <intent-filter> 
       <action android:name="android.accessibilityservice.AccessibilityService" /> 
      </intent-filter> 

      <meta-data 
       android:name="android.accessibilityservice" 
       android:resource="@xml/accessibility_service_config" /> 
     </service> 

accessibility_service_config.xml Datei

<accessibility-service xmlns:android="http://schemas.android.com/apk/res/android" 
    android:description="@string/accessibility_service_desc" 
    android:accessibilityEventTypes="typeAllMask" 
    android:accessibilityFlags="flagDefault|flagIncludeNotImportantViews" 
    android:accessibilityFeedbackType="feedbackSpoken" 
    android:notificationTimeout="100" 
    android:canRetrieveWindowContent="true" 
/> 

speichern die Aktivitätsnamen, wenn das Fenster Zustand

public class MyAccessibilityService extends AccessibilityService{ 
    public static String sActivityName; 
    @Override 
    public void onAccessibilityEvent(AccessibilityEvent event) { 
     // TODO Auto-generated method stub 
     if(event.getEventType() == AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED){ 
      Log.d("activitytest", "onAccessibilityEvent with window state changed"); 
      sActivityName = event.getClassName().toString(); 
     } 
    } 

    @Override 
    public void onInterrupt() { 
     // TODO Auto-generated method stub 

    } 

} 

Der Nachteil ist, geändert, dass Sie Benutzer müssen Ihren Erreichbarkeitsdienst unter Einstellungen aktivieren s.

7

können Sie den folgenden Code verwenden und den aktuellen Namen des Vordergrundaktivitätspakets abrufen.

if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.LOLLIPOP) { 
     // intentionally using string value as Context.USAGE_STATS_SERVICE was 
     // strangely only added in API 22 (LOLLIPOP_MR1) 
     @SuppressWarnings("WrongConstant") 
     UsageStatsManager usm = (UsageStatsManager) getSystemService("usagestats"); 
     long time = System.currentTimeMillis(); 
     List<UsageStats> appList = usm.queryUsageStats(UsageStatsManager.INTERVAL_DAILY, 
         time - 1000 * 1000, time); 
       if (appList != null && appList.size() > 0) { 
        SortedMap<Long, UsageStats> mySortedMap = new TreeMap<Long, UsageStats>(); 
        for (UsageStats usageStats : appList) { 
         mySortedMap.put(usageStats.getLastTimeUsed(), 
           usageStats); 
        } 
        if (mySortedMap != null && !mySortedMap.isEmpty()) { 
         currentApp = mySortedMap.get(
           mySortedMap.lastKey()).getPackageName(); 
        } 
       } 
    } else { 
     ActivityManager am = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE); 
     List<ActivityManager.RunningAppProcessInfo> tasks = am 
         .getRunningAppProcesses(); 
       currentApp = tasks.get(0).processName; 
    } 

diese Berechtigungen hinzufügen, um Manifest-Datei (erste ist für < API 21, zweite für> = API 21).

<uses-permission android:name="android.permission.GET_TASKS" /> 
<uses-permission android:name="android.permission.PACKAGE_USAGE_STATS" tools:ignore="ProtectedPermissions" /> 
+0

hast du diesen code in deiner app ausgeführt weil ich UsageStatsManager nicht finden kann. Können Sie Ihre Java-Datei oder Ihren Code teilen? –

+1

@nitishpatel 'UsageStatsManager' existiert nur auf API 21 und höher. –

+1

Dies funktioniert für den Namen des Vordergrundpakets, aber was ist mit dem Namen der Aktivitätsklasse? – user1118764

0

Try this

public static boolean isForeground(Context context) { 
    ActivityManager manager = (ActivityManager)context.getSystemService(Context.ACTIVITY_SERVICE); 
    List<ActivityManager.RunningAppProcessInfo> tasks = manager.getRunningAppProcesses(); 
    if(tasks.isEmpty()) 
     return false; 

    for (ActivityManager.RunningAppProcessInfo task : tasks) { 
     if(context.getPackageName().equalsIgnoreCase(task.processName)){ 
      return task.importance == ActivityManager.RunningAppProcessInfo.IMPORTANCE_FOREGROUND; 
     } 
    } 
    return false; 
} 
2

i eine Klasse erstellt haben, die /system/bin/toolbox Befehl verwendet Prozesse zu identifizieren und identifiziert dann sichtbar Anwendung. Muss hinzugefügt werden identifiziert System-Apps ohne UI und Android-Launcher.

ProcessManager.java

+0

ausgezeichnet. Toolbox ps funktioniert – zproxy

Verwandte Themen