【问题标题】:How to get running application activity Name in android 5.0(L)?如何在 android 5.0(L) 中获取正在运行的应用程序活动名称?
【发布时间】:2016-02-02 23:08:17
【问题描述】:

我正在使用以下代码来获取android中当前正在运行的活动名称。

ActivityManager am = (ActivityManager) aContext
                .getSystemService(Context.ACTIVITY_SERVICE);            
List<ActivityManager.RunningTaskInfo> alltasks = am
                .getRunningTasks(1);

ComponentName componentInfo = alltasks.get(0).topActivity;
componentInfo.getClassName();

System.out.println("Current:"+componentInfo.getClassName());

这在 android 5.0 以下的所有版本中都可以正常工作。但在 Android 5.0 中,它总是返回启动器活动

请任何人帮忙,因为我想在所有 android 版本中运行该应用程序。

【问题讨论】:

标签: android android-5.0-lollipop


【解决方案1】:

在 Android L 之前,您的代码可以工作,但从 Android L 开始,getRunningTask 将无法工作。您必须使用 getAppRunningProcess。

检查下面的代码 -

public class DetectCalendarLaunchRunnable implements Runnable {

@Override
public void run() {
  String[] activePackages;
  if (Build.VERSION.SDK_INT > Build.VERSION_CODES.KITKAT_WATCH) {
    activePackages = getActivePackages();
  } else {
    activePackages = getActivePackagesCompat();
  }
  if (activePackages != null) {
    for (String activePackage : activePackages) {
      if (activePackage.equals("com.google.android.calendar")) {
        //Calendar app is launched, do something
      }
    }
  }
  mHandler.postDelayed(this, 1000);
}

String[] getActivePackagesCompat() {
  final List<ActivityManager.RunningTaskInfo> taskInfo = mActivityManager.getRunningTasks(1);
  final ComponentName componentName = taskInfo.get(0).topActivity;
  final String[] activePackages = new String[1];
  activePackages[0] = componentName.getPackageName();
  return activePackages;
}

String[] getActivePackages() {
  final Set<String> activePackages = new HashSet<String>();
  final List<ActivityManager.RunningAppProcessInfo> processInfos = mActivityManager.getRunningAppProcesses();
  for (ActivityManager.RunningAppProcessInfo processInfo : processInfos) {
    if (processInfo.importance == ActivityManager.RunningAppProcessInfo.IMPORTANCE_FOREGROUND) {
      activePackages.addAll(Arrays.asList(processInfo.pkgList));
    }
  }
  return activePackages.toArray(new String[activePackages.size()]);
}
}  

希望对你有帮助:)

【讨论】:

  • 工作正常。你是我的救命稻草。非常感谢@Ashish Tamrakar
  • @AshishTamrakar ,在这里通过使用 ActivityManager.RunningAppProcessInfo calss,我们只获取包名称,而不是活动名称。所以根据问题改变答案。
  • 如果我想获取活动类的名称而不是包怎么办?
  • 我在 Android 5.1.1 中使用此代码并且总是再次获得启动器活动...门再次关闭?
  • 这将不再适用于更新 5.1.1,他们决定默默地删除支持。该方法现在将只返回您自己的包进程。
【解决方案2】:

你可以用这个:

String packageName = "";
String className = "";

UsageStatsManager usageStatsManager = (UsageStatsManager) this.getSystemService(Context.USAGE_STATS_SERVICE);

if (usageStatsManager != null)
{
   UsageEvents queryEvents = usageStatsManager.queryEvents(System.currentTimeMillis() - 10000, System.currentTimeMillis());

   if (queryEvents != null) 
   {
      UsageEvents.Event event = new UsageEvents.Event();

      while (queryEvents.hasNextEvent()) 
      {
          UsageEvents.Event eventAux = new UsageEvents.Event();
          queryEvents2.getNextEvent(eventAux);

          if (eventAux.getEventType() == UsageEvents.Event.MOVE_TO_FOREGROUND)
          {
              event = eventAux;
          }
      }

      packageName = event.getPackageName();
      className = event.getClassName();
   }
}

您需要android.permission.PACKAGE_USAGE_STATS,这是系统级权限,不会授予第三方应用。但是,声明权限意味着使用 API 的意图,并且设备的用户可以通过设置应用程序授予权限。

或者你可以这样做:

pm grant com.your.package android.permission.PACKAGE_USAGE_STATS

【讨论】:

    【解决方案3】:

    请查看link

    不幸的是,Android 5.0 中没有类似的功能:无法获得最顶层的 Activity,也无法在实时启动新应用程序/Activity 时获得任何回调。

    methods deplicated in 5.0

    【讨论】:

    • 嗯,您的链接实际上提供了答案?所以“这不可能”根本不是真的。更多:“取决于..”。
    • 如果你实现了无障碍服务,就有可能得到回调。
    猜你喜欢
    • 2011-04-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多