【问题标题】:Lollipop: Get top activity nameLollipop:获取热门活动名称
【发布时间】:2016-03-25 03:11:34
【问题描述】:

如何在 Lollipop 中获取热门活动名称?

((ActivityManager)getSystemService(Context.ACTIVITY_SERVICE)).
   getRunningTasks(1).get(0).topActivity

不再适用于 Lollipop:

     * @deprecated As of {@link android.os.Build.VERSION_CODES#LOLLIPOP}, this method
     * is no longer available to third party
     * applications: the introduction of document-centric recents means
     * it can leak person information to the caller.  For backwards compatibility,
     * it will still retu rn a small subset of its data: at least the caller's
     * own tasks, and possibly some other tasks
     * such as home that are known to not be sensitive.

从 MyActivity 中的 onResume 调用

MyApplication.getInstance().saveCurentActivity(MyActivity.this)
saveCurentActivity(Activity a) {
    this.activityName = a.getClass().getSimpleName();
}

不是一个好主意,因为 MyApplication 可能会因错误而被销毁(例如,NPE)。

【问题讨论】:

标签: android android-activity android-task


【解决方案1】:

这段代码对我有用。

ActivityManager activityManager = (ActivityManager)    context.getSystemService(Activity.ACTIVITY_SERVICE);
List<ActivityManager.RunningTaskInfo> taskInfo = activityManager.getRunningTasks(1);
String currentTopActivity = taskInfo.get(0).topActivity.getClassName();

它会给TopActivity。

【讨论】:

  • getRunningTasks 已弃用
  • 使用 getAppTasks() 和 gettaskinfo 代替......就像下面的 List tasks = activityManager.getAppTasks(); ActivityManager.RecentTaskInfo taskInfo = tasks.get(0).getTaskInfo();
【解决方案2】:

这对我有用:

                long end = System.currentTimeMillis();
                long INTERVAL=2000;
                long begin = end - INTERVAL;
                if (Build.VERSION.SDK_INT >= 21) {
                    UsageStatsManager us = (UsageStatsManager) MyServices.this.getSystemService(Context.USAGE_STATS_SERVICE);
                    UsageEvents usageEvents = us.queryEvents(begin, end);
                    while (usageEvents.hasNextEvent()) {
                        UsageEvents.Event event = new UsageEvents.Event();
                        usageEvents.getNextEvent(event);
                        if (event.getEventType() == UsageEvents.Event.MOVE_TO_FOREGROUND) {
                            Log.e("event", "timestamp : " + event.getTimeStamp());
                            Log.e("event", "package name : " + event.getPackageName());
                            Log.e("event", "Class name : " + event.getClassName());
                            //You can find activity name as Class name      

                        }

                    }
                }

【讨论】:

  • 这是 API 级别 22 但不是 21。
【解决方案3】:

我不熟悉您使用的原始 API,但您可以使用可以通过Application.registerActivityLifecycleCallbacks 注册的ActivityLifecycleCallbacks 来跟踪您的 应用中的 Activity 生命周期更改。每当创建、启动、恢复等活动时,它都会收到通知。您可以使用 onActivityResumedonActivityPaused 挂钩跟踪当前活动。

【讨论】:

  • 好主意,但是如何存储名称?不在 MyApplication 实例中。
  • 你对这些名字做了什么?您能否将其存储在 ActivityLifeCycleCallback 中并使其成为单例或静态实例?
  • 我需要将当前的顶级活动名称保存到变量中以便在我的逻辑中使用。我会试试你的解决方案,谢谢。
猜你喜欢
  • 1970-01-01
  • 2018-04-18
  • 2012-05-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-01-01
  • 2018-12-17
相关资源
最近更新 更多