Lollipop:获取热门活动名称
Posted
技术标签:
【中文标题】Lollipop:获取热门活动名称【英文标题】:Lollipop: Get top activity name 【发布时间】: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)。
【问题讨论】:
请查看我对类似问题的回答。 ***.com/a/36660429/4554069 【参考方案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 生命周期更改。每当创建、启动、恢复等活动时,它都会收到通知。您可以使用 onActivityResumed
和 onActivityPaused
挂钩跟踪当前活动。
【讨论】:
好主意,但是如何存储名称?不在 MyApplication 实例中。 你对这些名字做了什么?您能否将其存储在 ActivityLifeCycleCallback 中并使其成为单例或静态实例? 我需要将当前的***活动名称保存到变量中以便在我的逻辑中使用。我会试试你的解决方案,谢谢。以上是关于Lollipop:获取热门活动名称的主要内容,如果未能解决你的问题,请参考以下文章
无法从我的服务类(Android Lollipop)启动设备管理员活动
适用于移动和电视的 Android 通用应用程序 (Lollipop)
使用 Material Design 在 Android Lollipop 中的 ListView 中的活动转换动画
使用Material Design在Android Lollipop中的ListView中的活动过渡动画