如何在Android上跟踪“屏幕开启”时间?

时间:2014-02-10 09:46:03

标签: android screen

我正在尝试使用我的第一个应用程序(理论上)做一些简单的事情,但我需要一些帮助才能开始。我想构建一个应用程序,告诉我今天Nexus 4上的屏幕有多长时间了。

Android向我显示自上次充电以来屏幕已经显示的设置>电池>屏幕,但我不知道如何解析这些数据,或者如何将其限制在当天。 到目前为止我的研究表明,batterystats.bin参与了上面概述的屏幕跟踪,我可以使用ACTION_SCREEN_ON和ACTION_SCREEN_OFF,但我不确定这是否正是我正在寻找的。

有什么想法吗?

3 个答案:

答案 0 :(得分:3)

我知道这是一个老问题,但希望这会对某人有所帮助。

在我的服务中,我会侦听SCREEN_ON / SCREEN_OFF操作并获取两次之间的差异并保存到onDestroy回调中的sharedpreferences。

    BroadcastReceiver mybroadcast = new BroadcastReceiver() {

    @Override
    public void onReceive(Context context, Intent intent) {
        Log.i("[BroadcastReceiver]", "MyReceiver");

        if(intent.getAction().equals(Intent.ACTION_SCREEN_ON)){
            startTimer = System.currentTimeMillis();
        }
        else if(intent.getAction().equals(Intent.ACTION_SCREEN_OFF)){
            endTimer = System.currentTimeMillis();
            screenOnTime = endTimer - startTimer;

           if(screenOnTime < TIME_ERROR) {
               times.add(screenOnTime);
           }

        }

    }
};

服务在启动时启动,并且在更换软件包时(我发现它对调试很有用)。

public class BootReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        Intent i = new Intent(context, ScreenOnService.class);
        context.startService(i);
    }
}

这是广播接收器的清单

        <receiver android:name=".BootReceiver">
            <intent-filter>
                <action android:name="android.intent.action.BOOT_COMPLETED" />
            </intent-filter>
            <intent-filter>
                <action android:name="android.intent.action.PACKAGE_REPLACED" />
                <data android:scheme="package" android:path="com.application.test" />
            </intent-filter>
        </receiver>

答案 1 :(得分:1)

另一种解决方法是致电

UsageStatsManager.queryEvents

将一天的开始作为第一个参数,将当前时间作为结束参数,然后过滤结果以仅检查

UsageEvents.Event.SCREEN_INTERACTIVE UsageEvents.Event.SCREEN_NON_INTERACTIVE

事件

获取每个标签的时间戳,并对每个标签之间经过的所有时间求和

SCREEN_INTERACTIVE-> SCREEN_NON_INTERACTIVE

事件,这可以轻松显示屏幕互动的时间,因此可以开启屏幕并启用触摸。

您可能有一个SCREEN_INTERACTIVE事件,而该事件没有任何相关的SCREEN_NON_INTERACTIVE,这是

UsageEvents.Event.DEVICE_SHUTDOWN

事件发生,幸运的是,此事件与queryEvents方法返回的列表相同

还请记住声明并让用户允许here所述的android.permission.PACKAGE_USAGE_STATS权限

ps。我还没有使用过,但查看文档是正确的选择,可能是android设置使用的 pps。同时查看同一包中的其他事件,它们可能对您想要完成的事情很有帮助

答案 2 :(得分:0)

更好地实现为BroadcastReceiver:

var images = Directory.EnumerateFiles("Fruit")
    .Select(f => BitmapUtil.FromImage(f))
    .ToList();

}

您将需要这样注册接收者(例如在onCreate活动中):

public class ScreenTimeBroadcastReceiver extends BroadcastReceiver {

private long startTimer;
private long endTimer;
private long screenOnTimeSingle;
private long screenOnTime;
private final long TIME_ERROR = 1000;

public void onReceive(Context context, Intent intent) {
    Log.i(P.TAG, "ScreenTimeService onReceive");

    if(intent.getAction().equals(Intent.ACTION_SCREEN_ON)){
        startTimer = System.currentTimeMillis();
    }
    else if(intent.getAction().equals(Intent.ACTION_SCREEN_OFF)){
        endTimer = System.currentTimeMillis();
        screenOnTimeSingle = endTimer - startTimer;

        if(screenOnTimeSingle < TIME_ERROR) {
            screenOnTime += screenOnTime;
        }

    }
}