第一種方式
//得到棧頂Activity的名字,注意此處要進(jìn)行判斷,Android在5.0以后Google把getRunningTasks的方法給屏蔽掉了,所以要分開處理
private static String getTopActivityName(Context context) {
String topActivityPackageName;
ActivityManager manager = (ActivityManager) context.getSystemService(context.ACTIVITY_SERVICE);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
//此處要判斷用戶的安全權(quán)限有沒(méi)有打開,如果打開了就進(jìn)行獲取棧頂Activity的名字的方法
//當(dāng)然,我們的要求是如果沒(méi)打開就不獲取了,要不然跳轉(zhuǎn)會(huì)影響用戶的體驗(yàn)
if (isSecurityPermissionOpen(context)) {
UsageStatsManager mUsageStatsManager = (UsageStatsManager) context.getSystemService(Context.USAGE_STATS_SERVICE);
long endTime = System.currentTimeMillis();
long beginTime = endTime - 1000 * 60 * 2;
UsageStats recentStats = null;
List<UsageStats> queryUsageStats = mUsageStatsManager.queryUsageStats(UsageStatsManager.INTERVAL_BEST, beginTime, endTime);
if (queryUsageStats == null || queryUsageStats.isEmpty()) {
return null;
}
for (UsageStats usageStats : queryUsageStats) {
if (recentStats == null || recentStats.getLastTimeUsed() < usageStats.getLastTimeUsed()) {
recentStats = usageStats;
}
}
topActivityPackageName = recentStats.getPackageName();
return topActivityPackageName;
} else {
return null;
}
} else {
List<ActivityManager.RunningTaskInfo> taskInfos = manager.getRunningTasks(1);
if (taskInfos.size() > 0)
topActivityPackageName = taskInfos.get(0).topActivity.getPackageName();
else
return null;
return topActivityPackageName;
}
}
//判斷用戶對(duì)應(yīng)的安全權(quán)限有沒(méi)有打開
private static boolean isSecurityPermissionOpen(Context context) {
long endTime = System.currentTimeMillis();
UsageStatsManager usageStatsManager = (UsageStatsManager) context.getApplicationContext().getSystemService("usagestats");
List<UsageStats> queryUsageStats = usageStatsManager.queryUsageStats(UsageStatsManager.INTERVAL_BEST, 0, endTime);
if (queryUsageStats == null || queryUsageStats.isEmpty()) {
return false;
}
return true;
}
注意:此處是跳轉(zhuǎn)安全權(quán)限的跳轉(zhuǎn)代碼,如果你判斷用戶沒(méi)有開啟權(quán)限的話可以選擇跳轉(zhuǎn)進(jìn)行設(shè)置。
//Intent intent = new Intent(Settings.ACTION_USAGE_ACCESS_SETTINGS);
//startActivity(intent);
第二種方式
/**
* 注意: getRunningAppProcesses()方法在5.0開始,就只返回自身應(yīng)用的進(jìn)程,所以只能判斷自身進(jìn)程狀態(tài),
* 如果是400,返回為null,不能拿到當(dāng)前棧頂Activity的包名
*
* @param context
* @return
*/
private static String getCurrentPkgName(Context context) {
// 5x系統(tǒng)以后利用反射獲取當(dāng)前棧頂activity的包名.
ActivityManager.RunningAppProcessInfo currentInfo = null;
Field field = null;
int startTaskToFront = 2;
String pkgName = null;
try {
// 通過(guò)反射獲取進(jìn)程狀態(tài)字段.
field = ActivityManager.RunningAppProcessInfo.class.getDeclaredField("processState");
} catch (Exception e) {
e.printStackTrace();
}
ActivityManager am = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);
List appList = am.getRunningAppProcesses();
ActivityManager.RunningAppProcessInfo app;
for (int i = 0; i < appList.size(); i++) {
//ActivityManager.RunningAppProcessInfo app : appList
app = (ActivityManager.RunningAppProcessInfo) appList.get(i);
//表示前臺(tái)運(yùn)行進(jìn)程.
if (app.importance == ActivityManager.RunningAppProcessInfo.IMPORTANCE_FOREGROUND) {
Integer state = null;
try {
// 反射調(diào)用字段值的方法,獲取該進(jìn)程的狀態(tài).
state = field.getInt(app);
} catch (Exception e) {
e.printStackTrace();
}
// 根據(jù)這個(gè)判斷條件從前臺(tái)中獲取當(dāng)前切換的進(jìn)程對(duì)象
if (state != null && state == startTaskToFront) {
currentInfo = app;
break;
}
}
}
if (currentInfo != null) {
pkgName = currentInfo.processName;
}
return pkgName;
}