在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 "";
}
本文介绍了如何在Android系统中获取栈顶应用程序。在5.0以前,可通过ActivityManager的getRunningTasks()获取,但该方法在5.0后被废弃。5.0引入了getRunningAppProcesses(),但在5.1后无法获取运行服务。为解决这个问题,文章讲解了如何利用Android 5.0引入的UsageStatsManager类,以及如何添加权限和获取用户授权来获取当前运行的应用。
1045

被折叠的 条评论
为什么被折叠?



