获取Android上前台应用的Activity名称

a0zr77ik  于 2024-01-04  发布在  Android
关注(0)|答案(2)|浏览(206)

我需要获取前台应用程序的当前Activity。我试过遵循this answer,后来使用this library(因为第一个解决方案只能从Lollipop工作),他们确实很好地获取了前台应用程序的包名称,但我需要知道哪个Activity是打开的。

btxsgosb

btxsgosb1#

嘿@Capitan Luzzatto,

  • 在LOLLIPOP(API 21)之前,我们可以从ActivityManager获取正在运行的应用程序列表
  • 但是从LOLLIPOP,我们应该只从UsageStatsManager获取

首先,您需要2个权限来读取任务

  1. <uses-permission android:name="android.permission.GET_TASKS" />
  2. <uses-permission android:name="android.permission.PACKAGE_USAGE_STATS" />

字符串
您应该首先检查用户API级别是否为21或更高,如果是,您应该获得以下使用访问设置的访问权限

  1. if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.LOLLIPOP && !mIsChecked) {
  2. if (getUsageStatsList(getActivity()).isEmpty()) {
  3. Intent intent = new Intent(Settings.ACTION_USAGE_ACCESS_SETTINGS);
  4. startActivity(intent);
  5. }
  6. }


获取使用统计信息列表

  1. public static List<UsageStats> getUsageStatsList(Context context){
  2. UsageStatsManager usm = (UsageStatsManager) context.getSystemService("usagestats");
  3. Calendar calendar = Calendar.getInstance();
  4. long endTime = calendar.getTimeInMillis();
  5. calendar.add(Calendar.DATE, -1);
  6. long startTime = calendar.getTimeInMillis();
  7. List<UsageStats> usageStatsList = usm.queryUsageStats(UsageStatsManager.INTERVAL_DAILY,startTime,endTime);
  8. return usageStatsList;
  9. }


最后,您可以使用以下方法获得最新的前台应用程序

  1. public String getRecentApps(Context context) {
  2. String topPackageName = "";
  3. if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
  4. UsageStatsManager mUsageStatsManager = (UsageStatsManager) context.getSystemService(Context.USAGE_STATS_SERVICE);
  5. long time = System.currentTimeMillis();
  6. UsageEvents usageEvents = mUsageStatsManager.queryEvents(time - 1000 * 30, System.currentTimeMillis() + (10 * 1000));
  7. UsageEvents.Event event = new UsageEvents.Event();
  8. while (usageEvents.hasNextEvent()) {
  9. usageEvents.getNextEvent(event);
  10. }
  11. if (event != null && !TextUtils.isEmpty(event.getPackageName()) && event.getEventType() == UsageEvents.Event.MOVE_TO_FOREGROUND) {
  12. if (AndroidUtils.isRecentActivity(event.getClassName())) {
  13. return event.getClassName();
  14. }
  15. return event.getPackageName();
  16. } else {
  17. topPackageName = "";
  18. }
  19. } else {
  20. ActivityManager am = (ActivityManager) context.getSystemService(context.ACTIVITY_SERVICE);
  21. List<ActivityManager.RunningTaskInfo> taskInfo = am.getRunningTasks(1);
  22. ComponentName componentInfo = taskInfo.get(0).topActivity;
  23. if (AndroidUtils.isRecentActivity(componentInfo.getClassName())) {
  24. return componentInfo.getClassName();
  25. }
  26. topPackageName = componentInfo.getPackageName();
  27. }
  28. return topPackageName;
  29. }


要获取前台活动,请使用以下方法

  1. public String getRecentActivity(Context context) {
  2. String topActivityName = "";
  3. if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
  4. UsageStatsManager mUsageStatsManager = (UsageStatsManager) context.getSystemService(Context.USAGE_STATS_SERVICE);
  5. long time = System.currentTimeMillis();
  6. UsageEvents usageEvents = mUsageStatsManager.queryEvents(time - 1000 * 30, System.currentTimeMillis() + (10 * 1000));
  7. UsageEvents.Event event = new UsageEvents.Event();
  8. while (usageEvents.hasNextEvent()) {
  9. usageEvents.getNextEvent(event);
  10. }
  11. if (event != null && !TextUtils.isEmpty(event.getPackageName()) && event.getEventType() == UsageEvents.Event.MOVE_TO_FOREGROUND) {
  12. return event.getClassName();
  13. } else {
  14. topActivityName = "";
  15. }
  16. } else {
  17. ActivityManager am = (ActivityManager) context.getSystemService(context.ACTIVITY_SERVICE);
  18. List<ActivityManager.RunningTaskInfo> taskInfo = am.getRunningTasks(1);
  19. ComponentName componentInfo = taskInfo.get(0).topActivity;
  20. topActivityName = componentInfo.getClassName();
  21. }
  22. return topActivityName;
  23. }


AndroidUtils.java要在哈克的方式获得设备最近的屏幕,也许我们应该对此进行更多的调查,不确定它会在所有设备上工作,但它几乎适用于所有设备

  1. public class AndroidUtils {
  2. private static final String RECENT_ACTIVITY;
  3. static {
  4. if (Build.VERSION.SDK_INT > Build.VERSION_CODES.LOLLIPOP) {
  5. RECENT_ACTIVITY = "com.android.systemui.recents.RecentsActivity";
  6. } else if (Build.VERSION.SDK_INT > Build.VERSION_CODES.JELLY_BEAN_MR1) {
  7. RECENT_ACTIVITY = "com.android.systemui.recent.RecentsActivity";
  8. } else {
  9. RECENT_ACTIVITY = "com.android.internal.policy.impl.RecentApplicationDialog";
  10. }
  11. }
  12. /**
  13. * To get the Device recent screen activity
  14. *
  15. * @param className
  16. * @return activity
  17. */
  18. public static boolean isRecentActivity(String className) {
  19. if (RECENT_ACTIVITY.equalsIgnoreCase(className)) {
  20. return true;
  21. }
  22. return false;
  23. }
  24. }

展开查看全部
bfrts1fy

bfrts1fy2#

由于安全问题,您不应该这样做。您不希望其他应用知道您当前打开的活动。因此其他应用不希望您监视它们。这是操作系统的限制。

相关问题