1. 程式人生 > >Android獲取棧頂程式

Android獲取棧頂程式

在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類,通過這個類可以獲取到應用程式的執行情況,該類的使用方法如下:

  1. 在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 "";
	}