2014-11-23 50 views
20

我使用以下代碼獲取變量中的前臺應用程序的活動名稱foregroundTaskPackageName。它適用於4.1到4.4之間的所有操作系統版本,但不適用於Android 5.0 Lollipop。無法在Android Lollipop 5.0中獲得前景活動名稱

任何人都可以幫助改變5.0棒棒糖?在棒棒糖 - 我得到的文字foregroundTaskPackageName只是'Launcher3'。我正在使用Genymotion仿真器。

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

我在想,如果你能檢索與新UsageStatsManager的topActivity爲Android L.如果是,請讓我知道如何。示例代碼也是有用的。謝謝。 – user3144836 2014-12-26 06:28:26

+0

@ user3144836:你能找到獲得TopActivity的方法嗎? – venkat 2015-02-21 03:21:27

+0

@venkat:沒有。還沒有想到如何做到這一點,但在Android 5.0棒棒糖 – user3144836 2015-02-22 03:54:36

回答

5

getRunningTasks()

此方法已被廢棄在API級21 作爲棒糖的,這 方法不再提供給第三方應用程序:所述 引入文檔爲中心的最近通話裝置它可能會將人員信息泄漏給主叫方 。爲了向後兼容,它仍然會返回一小部分數據:至少是調用者自己的任務, 以及可能還有一些其他任務,例如已知不是 敏感的其他任務。

28

這對我的作品的棒棒糖(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 2015-01-28 21:14:22

+0

有沒有辦法使用這種方法獲得最高的活動? – venkat 2015-02-21 03:18:32

+0

因爲我希望從應用程序獲得確切的活動通知。 – venkat 2015-02-21 03:26:10

2

一個可用的,但不是最好的方法是使用輔助。

在AndroidManifest XML文件中聲明無障礙服務

<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文件

<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" 
/> 

店當窗口狀態改變的活動名稱

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 

    } 

} 

缺點是你需要讓用戶在設置中啓用您的輔助功能服務秒。

7

您可以使用下面的代碼並獲取當前的前臺活動包名稱。

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; 
    } 

到清單文件添加這些權限(第一個是用於< API 21,第二個是> = API 21)。

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

是否在應用程序中運行了此代碼?因爲我無法找到UsageStatsManager。你能分享你的java文件或代碼嗎? – 2016-01-29 04:58:38

+1

@nitishpatel UsageStatsManager只存在於API 21及更高版本上。 – 2016-03-14 18:42:49

+1

這適用於前臺程序包名稱,但Activity類名稱又如何? – user1118764 2016-07-05 07:11:41

0
嘗試

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

我已經創建了一個使用/system/bin/toolbox命令確定處理的類,然後識別可見的應用程序。 需要添加標識系統應用程序,沒有UI和Android啓動器。

ProcessManager.java

+0

優秀。工具箱ps的作品 – zproxy 2016-12-29 05:01:48