【发布时间】:2018-06-27 04:02:07
【问题描述】:
我正在开发锁定应用程序,当用户打开任何应用程序时。我的应用将触发,如果它与我的阻止列表匹配,那么我将向用户显示锁定屏幕。
到目前为止我做了什么。
public static String getTopAppName(Context context) {
ActivityManager mActivityManager = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);
String strName = "";
try {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
strName = getLollipopFGAppPackageName(context);
} else {
strName = mActivityManager.getRunningTasks(1).get(0).topActivity.getClassName();
}}
}
private static String getLollipopFGAppPackageName(Context ctx) {
try {
UsageStatsManager usageStatsManager = (UsageStatsManager) ctx.getSystemService("usagestats");
long milliSecs = 60 * 1000;
Date date = new Date();
List<UsageStats> queryUsageStats = usageStatsManager.queryUsageStats(UsageStatsManager.INTERVAL_DAILY, date.getTime() - milliSecs, date.getTime());
if (queryUsageStats.size() > 0) {
Log.i("LPU", "queryUsageStats size: " + queryUsageStats.size());
}
long recentTime = 0;
String recentPkg = "";
for (int i = 0; i < queryUsageStats.size(); i++) {
UsageStats stats = queryUsageStats.get(i);
if (i == 0 && !"org.pervacio.pvadiag".equals(stats.getPackageName())) {
Log.i("LPU", "PackageName: " + stats.getPackageName() + " " + stats.getLastTimeStamp());
}
if (stats.getLastTimeStamp() > recentTime) {
recentTime = stats.getLastTimeStamp();
recentPkg = stats.getPackageName();
}
}
return recentPkg;
} catch (Exception e) {
e.printStackTrace();
}
return "";
}
我正在关注this SO Answer,以获取 Lollipop 上方设备中的最高运行活动。我为此创建了后台服务。
我面临的问题:
1.当用户阻止我的应用程序中的任何应用程序时,我将获得该应用程序的包名称。例如(com.google.android.talk、com.google.android.apps.maps、com.android.chrome)。
在后台运行服务时。我正在为所有谷歌应用程序(地图,环聊)获得顶级包名称com.google.android.gsf。所以我很难识别特定的应用程序。
我认为问题出在getLollipopFGAppPackageName(),但我不知道是什么。
2. 正如一些 SO 帖子中提到的,getLollipopFGAppPackageName() 只能在调试时使用,不能用于实际实现。因此,如果我不使用它,那么在棒棒糖上方的设备中实现这种功能(锁定应用程序)的正确方法可能是什么。
任何帮助或指导都会很棒。谢谢
【问题讨论】:
标签: android android-studio android-activity service