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

Ale*_*son 8 android screen

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

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

有任何想法吗?

Sam*_*cid 9

另一种解决方案可以是调用

使用统计管理器.queryEvents

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

使用事件.Event.SCREEN_INTERACTIVE 使用事件.Event.SCREEN_NON_INTERACTIVE

事件

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

SCREEN_INTERACTIVE -> SCREEN_NON_INTERACTIVE

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

您可能会遇到一个没有任何相关 SCREEN_NON_INTERACTIVE 事件的 SCREEN_INTERACTIVE 事件,此时

使用事件.事件.DEVICE_SHUTDOWN

事件发生,幸运的是该事件位于 queryEvents 方法返回的同一个列表中

还记得声明并让用户允许 android.permission.PACKAGE_USAGE_STATS 权限,如此处所述

附:我还没有使用过这个,但是查看文档,它是正确的使用方式,可能是 android 设置 pps 使用的那个。另请参阅同一包中的其他事件,它们可能对您想要完成的任务有帮助

  • 这个实现比接受的答案或其任何变体对我来说效果更好,并且似乎解决了更多意想不到的情况,因为您可以从返回的查询事件中检查几乎任何状态/事件 (2认同)

Nic*_*171 5

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

在我的服务中,我监听 SCREEN_ON/SCREEN_OFF 动作并获取两次之间的差异并保存到 onDestroy 回调中的共享首选项。

    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);
           }

        }

    }
};
Run Code Online (Sandbox Code Playgroud)

该服务在启动和更换包时启动(我发现它有助于调试)。

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

这是我的广播接收器清单

        <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>
Run Code Online (Sandbox Code Playgroud)

  • 我们不能保证服务在后台持续运行。 (3认同)