Android獲取棧頂程式
阿新 • • 發佈:2019-02-14
在5.0以前google給我們提供的API是ActivityManager類中通過getRunningTasks()獲取當前開啟的所有應用程式 ,所以,如果想要獲取當前的棧頂Activity,只需要以下方法:
ActivityManager activityManager = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE); List<ActivityManager.RunningTaskInfo> appTasks = activityManager.getRunningTasks(1); if (null != appTasks && !appTasks.isEmpty()) { return appTasks.get(0).topActivity.getPackageName(); }
但是,隨著Android版本的升級google對許可權控制也越來嚴謹了,在平時開發中有這樣的需求,獲取當前開啟的應用程式或者使用者正在執行的應用程式,怎麼辦呢?
5.0版本之後google廢棄了getRunningTasks()方法,意味著我們在5.0以後不能通過該方法獲取正在執行的應用程式,google在5.0又提供類新的api,那就是getRunningAppProcesses(),通過ActivityManager的getRunningAppProcesses()方法也可以獲取正在執行的應用程式。
但是,在5.1的版本釋出後getRunningAppProcesses()已經獲取不到正在執行的服務...
怎麼辦呢??別急,往下看。
原來,Android在5.0版本google提供了一個UsageStatsManager類,通過這個類可以獲取到應用程式的執行情況,該類的使用方法如下:
- 在AndroidManifest檔案中新增許可權:
<uses-permission android:name="android.permission.PACKAGE_USAGE_STATS" />
2.啟動授權頁面,需要使用者授權
Intent intent = new Intent(Settings.ACTION_USAGE_ACCESS_SETTINGS); context.startActivity(intent);
一定要申請使用者授權,如果使用者不給你授權,那麼你還是拿不到的哦~~~
3.如果使用者給你授權了,呼叫相關程式碼獲取正在執行的服務:
UsageStatsManager usm = (UsageStatsManager) context.getSystemService(Context.USAGE_STATS_SERVICE);
Calendar calendar = Calendar.getInstance();
long endTime = calendar.getTimeInMillis();
calendar.add(Calendar.YEAR, -1);
long startTime = calendar.getTimeInMillis();
List<UsageStats> usageStatsList = usm.queryUsageStats(UsageStatsManager.INTERVAL_DAILY, startTime, endTime);
另附:獲取棧頂元素方法:
public static String getLauncherTopApp(Context context) {
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) {
ActivityManager activityManager = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);
List<ActivityManager.RunningTaskInfo> appTasks = activityManager.getRunningTasks(1);
if (null != appTasks && !appTasks.isEmpty()) {
return appTasks.get(0).topActivity.getPackageName();
}
} else {
long endTime = System.currentTimeMillis();
long beginTime = endTime - 10000;
if (sUsageStatsManager == null) {
sUsageStatsManager = (UsageStatsManager) context.getSystemService(Context.USAGE_STATS_SERVICE);
}
String result = "";
UsageEvents.Event event = new UsageEvents.Event();
UsageEvents usageEvents = sUsageStatsManager.queryEvents(beginTime, endTime);
while (usageEvents.hasNextEvent()) {
usageEvents.getNextEvent(event);
if (event.getEventType() == UsageEvents.Event.MOVE_TO_FOREGROUND) {
result = event.getPackageName();
}
}
if (!android.text.TextUtils.isEmpty(result)) {
return result;
}
}
return "";
}