Android 确定当前前台(正在运行)应用程序的最佳方法(使用服务?)

Android 确定当前前台(正在运行)应用程序的最佳方法(使用服务?),android,android-intent,service,time,Android,Android Intent,Service,Time,我正在构建一个应用程序,它需要确定应用程序运行的时间,以便我可以显示他/她使用的应用程序的用户统计信息。我在网上找到了多种解决方案,但都有其缺陷 以下是我找到的两个最佳选择: 有服务。此解决方案似乎电池效率低下,取决于一种方法(自API级别21起): getRunningTasks(整数最大值) 在棒棒糖中引入了新的“”,但此解决方案仅适用于运行android>5.0的设备。但我也希望支持较旧的设备 我还搜索了应用程序启动或停止时的意图触发,但似乎有(见摘要)。这证实了这一点。我还发现了

我正在构建一个应用程序,它需要确定应用程序运行的时间,以便我可以显示他/她使用的应用程序的用户统计信息。我在网上找到了多种解决方案,但都有其缺陷

以下是我找到的两个最佳选择:

  • 有服务。此解决方案似乎电池效率低下,取决于一种方法(自API级别21起):

    getRunningTasks(整数最大值)

  • 在棒棒糖中引入了新的“”,但此解决方案仅适用于运行android>5.0的设备。但我也希望支持较旧的设备

我还搜索了应用程序启动或停止时的意图触发,但似乎有(见摘要)。这证实了这一点。我还发现了一个类:当一个活动改变它的状态时,它会得到回调。但这只供内部(在您自己的应用程序中读取)使用

因此,我的想法是使用一项服务在运行棒棒糖以外版本的设备上轮询当前的前台应用程序,并在运行棒棒糖或更高版本的设备上使用新的API。但是,正如我之前所说,这种“服务”的想法是最好的选择吗?因为它似乎电池效率低下?也许有更好的选择


Faas第一个选项肯定是坏的,因为它已被弃用

我宁愿建议你使用

你引用的应用程序可能在浪费大量CPU时间、RAM和电池寿命,不断轮询ActivityManager


请记住,如果您计划让用户以外的任何人访问它,那么您打算跟踪的内容几乎是侵犯隐私的行为,而这正是CarrierIQ所面临的麻烦。

如果您所担心的都是不推荐的方法,那么只需进行生成版本检查并相应地使用方法即可。不,我担心的是是否会出现这种情况“服务”是解决这个问题的好办法。我希望这个问题能得到最有效的解决,在我看来,这就是“服务”“这个想法远远不够有效。嗨,我正在Android上做类似的事情。您建议使用android.app.usage,但这是在API 21中引入的,因此不适用于API<21。您是否有针对旧API的解决方案。事实上,我一直在使用一项服务,虽然我意识到这是一个糟糕的选择,但我还没有找到任何其他方法来实现这一点。你可以尝试使用./adb shell dumpsys usagestats。但是,对于dumpsys,你需要安卓.permission.DUMP,我认为除非应用程序位于系统分区中,否则无法使用它。