首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計疑難解答

Android 監測前台 App 方案:getRunningTasks 使用與替代方案

     編輯:程式設計疑難解答

需求場景

需實時監控手機上任意 App 的打開情況,獲取當前最上層應用的包名。

經典方案(API 21 前有效)

// 權限:AndroidManifest.xml
<uses-permission android:name="android.permission.GET_TASKS"/>

// 核心代碼
ActivityManager am = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);
List<ActivityManager.RunningTaskInfo> tasks = am.getRunningTasks(1);
ComponentName top = tasks.get(0).topActivity;
String pkg = top.getPackageName();  // 當前前台 App 包名
Log.i("Monitor", "Foreground: " + pkg);

放入定時器或循環中即可輪詢監聽。

⚠️ 重大限制:Android 5.0+ 棄用

getRunningTasks 在 Android 5.0 (API 21) 起僅返回調用者自身任務,不再提供其他應用信息。Google 為保護隱私徹底封殺此接口。

現代替代方案

  1. UsageStatsManager (API 21+):需用戶授權「查看應用使用情況」權限,可查詢時間段內前台應用統計,非實時。
  2. AccessibilityService:監聽 TYPE_WINDOW_STATE_CHANGED 事件,可實時捕獲窗口變化獲取包名,但需用戶開啟無障礙服務,審核嚴格。
  3. Foreground Service + NotificationListenerService:結合通知監聽間接推斷活躍應用。

選型建議

  • 系統工具類 App:AccessibilityService 體驗最佳,但需引導用戶開啟權限。
  • 統計分析類:UsageStatsManager 合規穩定。
  • 單純學習/內部測試:低版本模擬器跑 getRunningTasks 理解原理即可。

核心提示:沒有完全無感、無權限、實時的通用方案,一切以用戶隱私授權為前提。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved