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

Android 5.0+ 獲取運行進程失效:getRunningAppProcesses 限制與替代方案

     編輯:程式設計綜合問答

問題現象

調用 ActivityManager.getRunningAppProcesses() 在 Android 5.0 (API 21) 以上返回列表為空或僅包含自身進程,無法獲取第三方應用信息。

原因

Android 5.0 為保護隱私,**限制非系統應用獲取完整進程列表**。getRunningAppProcesses() 僅返回調用者自身進程及少量系統進程。

替代方案對比

方案適用場景優點缺點
UsageStatsManager統計用戶應用使用情況官方推薦,可獲取前台應用、使用時長需用戶授權「查看應用使用權限」(Settings → Security → Apps with usage access)
AccessibilityService輔助功能,監聽窗口變化可實時感知前台 Activity需用戶開啟無障礙服務,審核嚴格
前台服務 + 通知自身應用保活不依賴系統 API 限制無法獲取其他應用進程
Root / 系統簽名系統級應用、定製 ROM繞過所有限制普通應用不可用

推薦實現:UsageStatsManager 獲取前台應用


@RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
public String getTopPackageName(Context context) {
    UsageStatsManager usm = (UsageStatsManager) context.getSystemService(Context.USAGE_STATS_SERVICE);
    long now = System.currentTimeMillis();
    List stats = usm.queryUsageStats(UsageStatsManager.INTERVAL_DAILY, now - 1000*60*60, now);
    if (stats == null || stats.isEmpty()) return null;
    UsageStats top = Collections.max(stats, Comparator.comparingLong(UsageStats::getLastTimeUsed));
    return top.getPackageName();
}

清單文件聲明權限:



引導用戶授權:


startActivity(new Intent(Settings.ACTION_USAGE_ACCESS_SETTINGS));

內存信息獲取調整

無法遍歷所有進程計算內存,建議:

  • 僅監控**自身應用**內存:Debug.MemoryInfo 針對 android.os.Process.myPid()。
  • 展示**系統整體內存**:ActivityManager.getMemoryInfo(ActivityManager.MemoryInfo)。

參考鏈接

Android 5.0+ 獲取運行進程限制詳解

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