检测Android应用程序启动活动

11
我在stackoverflow上搜索了这个问题,找到了两篇文章: Android, Detect when other apps are launchedReliable way to detect application launch from home / desktop? ,这两篇文章有一些回答我的问题,但还不够。 我想做什么 我想创建一个小部件/应用程序,向设备用户显示最近使用过的应用程序列表和最常用的应用程序列表。 问题 如何获得准确的应用程序数据,以便建立最常用的应用程序列表。 基本信息
  • 我正在编译自己的Android OS(基于4.2),所以我可以访问所有内容。
  • 我也正在开发启动器。
  • 它需要通过CTS并获得Google批准。
  • 我可以使用系统权限创建该应用程序。
  • 我知道这可能是对Google的安全问题。
一些解决方案

最近使用的应用程序可以通过ActivityManager的getRecentApps方法找到,因此没有问题。

我已经在网上搜索了这个问题,并找到了以下解决方案:

  1. 使用服务每X秒查询activityManager的getRunningTasks方法,并构建列表(不准确的信息,还会耗费很多电池)。
  2. 使用logcat获取此信息(对我来说似乎是一种黑客方式,需要系统权限)
  3. 更改activityManager本身,以提供此信息(很可能无法通过CTS测试)
  4. 使用启动器验证已启动的应用程序(无法检测在其他应用程序内部启动的应用程序)

还有其他我错过的吗?

谢谢, Tiago Costa


你几乎完美地列出了所有4个选项。我更喜欢使用(ActivityManager)this.getSystemService(ACTIVITY_SERVICE); - srf
谢谢您的回答,我会尝试它们并看看哪一个效果最好。再次感谢。 - Tiago Costa
除非您拥有根权限,否则logcat在Android 4.2及更高版本上无法使用,请参见https://groups.google.com/forum/?fromgroups=#!topic/android-developers/6U4A5irWang。 - mattlaabs
谢谢你提醒我,我知道在4.2版本中有这个问题,忘了在日志解决方案中提到它,我会更新的。 - Tiago Costa
1个回答

1

Android默认的最近应用程序对话框实现是您的最佳参考,看这里..检查reloadButtons()

final ActivityManager am = (ActivityManager)
                context.getSystemService(Context.ACTIVITY_SERVICE);
        final List<ActivityManager.RecentTaskInfo> recentTasks =
                am.getRecentTasks(MAX_RECENT_TASKS, ActivityManager.RECENT_IGNORE_UNAVAILABLE);

你可以尝试类似的方式...

谢谢您的评论,我已经尝试了所有4个步骤,并选择在启动器中捕获startappplication调用。它几乎具有完美的信息,没有额外的处理。 - Tiago Costa
你能具体说明“几乎完美”是什么吗?你缺少了什么? - Fredrick Gauss
在其他不是我的启动器中启动的应用程序。由于大多数人通过启动器启动活动,因此它符合我的目的。 - Tiago Costa
我也遇到了完全相同的问题,而且已经尝试了很长时间。您能详细说明一下在启动器中如何捕获startapplication调用吗?如果有代码就更好了。谢谢。 - Faheem

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