Android获取栈顶程序

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

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


评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值