我使用以下代码在变量 foregroundTaskPackageName 中获取前台应用的活动名称。它适用于4.1到4.4之间的所有操作系统版本,但在Android 5.0 Lollipop中不起作用。
任何人都可以帮助5.0 Lollipop中的变化吗?在Lollipop中 - 我为 foregroundTaskPackageName 获取的文字只是'Launcher3'。我正在使用Genymotion仿真器。
ActivityManager am = (ActivityManager) getSystemService(ACTIVITY_SERVICE);
RunningTaskInfo foregroundTaskInfo = am.getRunningTasks(1).get(0); // get
// list
// of
// running
// tasks
String foregroundTaskAppName = null;
String foregroundTaskPackageName = foregroundTaskInfo.topActivity
.getPackageName();
答案 0 :(得分:29)
这对Lollipop(21)来说很有用:
ActivityManager manager = (ActivityManager)mContext.getSystemService(Context.ACTIVITY_SERVICE);
List<ActivityManager.RunningAppProcessInfo> tasks = manager.getRunningAppProcesses();
Log.i("current_app",tasks.get(0).processName);
答案 1 :(得分:9)
您需要使用新的UsageStatsManager
并调用其queryUsageStats
方法来获取已启动活动的历史记录。
请注意,用户需要在Security-&gt;具有使用权限的应用程序中提供设备设置的使用情况统计信息。
链接:
答案 2 :(得分:7)
您可以使用下面的代码并获取当前的前台活动包名称。
if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.LOLLIPOP) {
// intentionally using string value as Context.USAGE_STATS_SERVICE was
// strangely only added in API 22 (LOLLIPOP_MR1)
@SuppressWarnings("WrongConstant")
UsageStatsManager usm = (UsageStatsManager) getSystemService("usagestats");
long time = System.currentTimeMillis();
List<UsageStats> appList = usm.queryUsageStats(UsageStatsManager.INTERVAL_DAILY,
time - 1000 * 1000, time);
if (appList != null && appList.size() > 0) {
SortedMap<Long, UsageStats> mySortedMap = new TreeMap<Long, UsageStats>();
for (UsageStats usageStats : appList) {
mySortedMap.put(usageStats.getLastTimeUsed(),
usageStats);
}
if (mySortedMap != null && !mySortedMap.isEmpty()) {
currentApp = mySortedMap.get(
mySortedMap.lastKey()).getPackageName();
}
}
} else {
ActivityManager am = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE);
List<ActivityManager.RunningAppProcessInfo> tasks = am
.getRunningAppProcesses();
currentApp = tasks.get(0).processName;
}
将这些权限添加到Manifest文件中(第一个用于&lt; API 21,第二个用于&gt; = API 21)。
<uses-permission android:name="android.permission.GET_TASKS" />
<uses-permission android:name="android.permission.PACKAGE_USAGE_STATS" tools:ignore="ProtectedPermissions" />
答案 3 :(得分:4)
根据getRunningTasks()文档:
此方法在API级别21中已弃用。自LOLLIPOP起,此处 方法不再适用于第三方应用程序: 引入以文档为中心的最近意味着它可以泄漏人 给呼叫者的信息。为了向后兼容,它仍然会 返回其数据的一小部分:至少是调用者自己的任务, 可能还有一些其他的任务,例如家里已知的不是 敏感。
答案 4 :(得分:2)
可用但不是最好的方法是使用辅助功能。
在AndroidManifest xml文件中声明辅助功能服务
<service
android:name=".MyAccessibilityService"
android:label="@string/accessibility_service_label"
android:permission="android.permission.BIND_ACCESSIBILITY_SERVICE" >
<intent-filter>
<action android:name="android.accessibilityservice.AccessibilityService" />
</intent-filter>
<meta-data
android:name="android.accessibilityservice"
android:resource="@xml/accessibility_service_config" />
</service>
accessibility_service_config.xml文件
<accessibility-service xmlns:android="http://schemas.android.com/apk/res/android"
android:description="@string/accessibility_service_desc"
android:accessibilityEventTypes="typeAllMask"
android:accessibilityFlags="flagDefault|flagIncludeNotImportantViews"
android:accessibilityFeedbackType="feedbackSpoken"
android:notificationTimeout="100"
android:canRetrieveWindowContent="true"
/>
在窗口状态更改时存储活动名称
public class MyAccessibilityService extends AccessibilityService{
public static String sActivityName;
@Override
public void onAccessibilityEvent(AccessibilityEvent event) {
// TODO Auto-generated method stub
if(event.getEventType() == AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED){
Log.d("activitytest", "onAccessibilityEvent with window state changed");
sActivityName = event.getClassName().toString();
}
}
@Override
public void onInterrupt() {
// TODO Auto-generated method stub
}
}
缺点是您需要让用户在“设置”中启用您的辅助功能服务。
答案 5 :(得分:2)
我创建了一个使用/system/bin/toolbox
命令识别进程然后识别可见应用程序的类。
需要添加识别没有UI和Android启动器的系统应用程序。
答案 6 :(得分:0)
试试这个
public static boolean isForeground(Context context) {
ActivityManager manager = (ActivityManager)context.getSystemService(Context.ACTIVITY_SERVICE);
List<ActivityManager.RunningAppProcessInfo> tasks = manager.getRunningAppProcesses();
if(tasks.isEmpty())
return false;
for (ActivityManager.RunningAppProcessInfo task : tasks) {
if(context.getPackageName().equalsIgnoreCase(task.processName)){
return task.importance == ActivityManager.RunningAppProcessInfo.IMPORTANCE_FOREGROUND;
}
}
return false;
}