运行getSystemService时重复PackageNames(Context.USAGE_STATS_SERVICE);

时间:2016-12-15 13:15:35

标签: android usage-statistics

我试图在我的Android手机中获取每个活动的前景时间。

我执行的代码如下

 @RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
    public List<UsageStats> getUsageStats() {
        UsageStatsManager mUsageStatsManager = (UsageStatsManager) getActivity()
                .getSystemService(Context.USAGE_STATS_SERVICE);
        Calendar cal = Calendar.getInstance();
        cal.add(Calendar.DATE, -1);
        List<UsageStats> queryUsageStats = mUsageStatsManager
                .queryUsageStats(UsageStatsManager.INTERVAL_DAILY, cal.getTimeInMillis(),
                        System.currentTimeMillis());


        return queryUsageStats;
    }

这是印刷声明

for(UsageStats usageStats:getUsageStats()){
    Log.i("Usage Stats",usageStats.toString()+"\t"+usageStats.getPackageName()+"\t"+usageStats.getTotalTimeInForeground());
}

我得到的结果如下。

com.whatsapp    2413684
com.google.android.googlequicksearchbox 2344707
com.google.android.youtube      1786804
com.google.android.googlequicksearchbox 1683449
com.google.android.googlequicksearchbox 1577473
com.whatsapp    1040572 

因为你可以whatsapp和谷歌搜索框有两次,并有不同的前景时间。

任何人都可以告诉我为什么我会两次获得它,并且有一种方法可以让我只获得活动在ForeGround中的时间。

1 个答案:

答案 0 :(得分:1)

运行命令时:

adb shell "ps -x | grep google"

我得到以下输出(截断):

u0_a22    1977  1267  1480140 46296    ep_poll 0000000000 S com.google.android.googlequicksearchbox:interactor (u:2, s:7)
u0_a22    2115  1267  1895332 210352    ep_poll 0000000000 S com.google.android.googlequicksearchbox:search (u:1866, s:7987)

这意味着googlequicksearchbox应用程序在两个不同的进程中运行(由进程名称和PID区分)。

您获得的时间是前台进程。这意味着here。这不仅意味着这些活动。

通常,当以简单的方式打开应用程序时,没有其他方法可以获得时间。这是因为,应用程序可以显示活动,服务和持续通知。所有这些都可能会影响用户体验。考虑Facebook Chat Heads。它们可能位于屏幕的一角,对用户可见,但另一个应用程序被打开(其中一个活动是在onResume事件之后)。但Facebook正在前景中运行,用户看到它。因此前台至少有2个正在运行的应用程序。

如果包名称完全相同,解决方案就是总结结果。或者另一种方法是在后台运行常量服务,一次检查运行的应用程序。但这是一个更耗时且劳动密集的解决方案。