棒棒糖(Lollipop): 获取顶部活动名称

3
如何在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)时被销毁。


请检查我对类似问题的答案。https://dev59.com/oV4c5IYBdhLWcg3wUI0N#36660429 - AmAnDroid
3个回答

1

这段代码在我的电脑上能够运行。

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

它将给出顶部活动。

1
getRunningTasks已被弃用 - VKDev
1
使用getAppTasks()和getTaskInfo()代替...像下面这样 List<ActivityManager.AppTask> tasks = activityManager.getAppTasks(); ActivityManager.RecentTaskInfo taskInfo = tasks.get(0).getTaskInfo(); - user3863488

1
这对我有效:

                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。 - 林果皞

0

好主意,但我该如何存储名称?不要在MyApplication实例中。 - VKDev
你对这些名称做了什么?你能把它们存储在ActivityLifeCycleCallback中并将其作为单例或静态实例吗? - cwbowron
我需要将当前顶部活动名称保存到变量中以便在我的逻辑中使用。我会尝试您的解决方案,谢谢。 - VKDev

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接