概述
有时候我们需要判断栈顶的应用是否是我们的应用,于是获取栈顶的应用包名的需求就出现了
在android5.0之前,系统有提供API借口用于获取TopActivity包名:
ActivityManager manager = (ActivityManager) getApplicationContext().getSystemService(ACTIVITY_SERVICE);
String currentClassName = manager.getRunningTasks(1).get(0).topActivity.getPackageName();
但在5.0之后,Google做了限制,getRunningTasks() 接口加了 @Deprecated 注解,被弃用了
但天无绝人之路,这边有两个方式可以获取TopActivity的包名:
第一种:使用UsageStatsManager(适用于三方应用或者系统应用)
UsageStatManager是一个使用情况统计管理者,通过它可以获取应用的使用情况,通过List集合来记录APP的使用情况,通过UsageStats对象可以获取包名,最后的在前台的时间,在前台的次数等等
需要权限:
<uses-permission android:name="android.permission.PACKAGE_USAGE_STATS"
tools:ignore="ProtectedPermissions"/>
下面是获取的方法:
ForegroundAppUtils:将获取前台包名等方法封装成一个工具类
public class ForegroundAppUtil {
private static final long END_TIME = System.currentTimeMillis();
private static final long TIME_INTERVAL = 7 * 24 * 60 * 60 * 1000L;
private static final long START_TIME = END_TIME - TIME_INTERVAL;
// 获取栈顶Activity包名
public static String getForegroundActivityName(Context context) {
String currentClassName = null;
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) { // 5.0之前,用getRunningTasks()接口
ActivityManager manager = (ActivityManager)context.getApplicationContext()
.getSystemService(Context.ACTIVITY_SERVICE);
currentClassName = manager.getRunningTasks(1).get(0).topActivity.getPackageName();
} else { // 5.0之后,用UsageStatManager
UsageStats initStat = getForegroundUsageStats(context, START_TIME, END_TIME);
if (initStat != null) {
currentClassName = initStat.getPackageName();
}
}
return currentClassName;
}
// 获取记录前台应用的UsageStats对象
private static UsageStats getForegroundUsageStats(Context context, long startTime, long endTime) {
UsageStats usageStatsResult = null;
if (android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
List<UsageStats> usageStatses = getUsageStatsList(context, startTime, endTime);
if (usageStatses == null || usageStatses.isEmpty()) return null;
for (UsageStats usageStats : usageStatses) {
if (usageStatsResult == null || usageStatsResult.getLastTimeUsed()
< usageStats.getLastTimeUsed()) {
usageStatsResult = usageStats;
}
}
}
return usageStatsResult;
}
// 获取记录当前应用的UsageStats对象
public static UsageStats getCurrentUsageStats(Context context, long startTime, long endTime) {
if (android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
List<UsageStats> usageStatses = getUsageStatsList(context, startTime, endTime);
if (usageStatses == null || usageStatses.isEmpty()) return null;
for (UsageStats usageStats : usageStatses) {
if (TextUtils.equals(usageStats.getPackageName(), context.getPackageName())) {
return usageStats;
}
}
}
return null;
}
// 通过UsageStatsManager获取List<UsageStats>集合
public static List<UsageStats> getUsageStatsList(Context context, long startTime, long endTime) {
if (android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
UsageStatsManager manager = (UsageStatsManager) context.getApplicationContext()
.getSystemService(Context.USAGE_STATS_SERVICE);
//UsageStatsManager.INTERVAL_WEEKLY,UsageStatsManager的参数定义了5个,具体查阅源码
List<UsageStats> usageStatses =
manager.queryUsageStats(UsageStatsManager.INTERVAL_BEST, startTime, endTime);
if (usageStatses == null || usageStatses.size() == 0) { // 没有权限,获取不到数据
Intent intent = new Intent(Settings.ACTION_USAGE_ACCESS_SETTINGS);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
context.getApplicationContext().startActivity(intent);
return null;
}
return usageStatses;
}
return null;
}
// 判断当前应用是否在前台
public static boolean isForegroundApp(Context context) {
return TextUtils.equals(getForegroundActivityName(context), context.getPackageName());
}
// 获取时间段内
public static long getTotleForegroundTime(Context context) {
UsageStats usageStats = getCurrentUsageStats(context, START_TIME, END_TIME);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
return usageStats != null ? usageStats.getTotalTimeInForeground() : 0;
}
return 0;
}
}
第二种:在framework添加相关接口实现(适用于系统应用)
- 在IActivityManager.aidl添加接口:
String getTopActPkg();
- 在ActivityManager.java里面添加实现:
/**
* @hide
*/
public String getTopActPkg() {
try {
return getService().getTopActPkg();
} catch (RemoteException e) {
throw e.rethrowFromSystemServer();
}
}
- 在ActivityManagerService.java添加具体实现:
@Override
public String getTopActPkg() throws RemoteException {
return mTopActPackage;
}
其中mTopActPackage是一个私有全局变量,在private final ActivityRecord resumedAppLocked()方法return之前把该方法的局部变量pkg赋值给mTopActPackage进行初始化
- 调用该接口获取TopActivity的包名
public static String getForegroundActivityName(Context context) {
ActivityManager activityManager =
(ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);
String topPackage = activityManager.getTopActPkg();
}
最后
以上就是现代蚂蚁为你收集整理的Android获取栈顶的应用的PackageName的全部内容,希望文章能够帮你解决Android获取栈顶的应用的PackageName所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复