我正在尝试用我的第一个应用程序做一些简单的事情(理论上),但我需要一些帮助才能开始.我想构建一个应用程序,告诉我Nexus 4的屏幕今天已经有多长时间了.
Android显示自上次通过设置>电池>屏幕充电以来屏幕已经显示多长时间,但我不确定如何解析此数据,或者如何将其限制为当前日期.到目前为止我的研究表明,batterystats.bin参与了上面概述的屏幕跟踪,我可以使用ACTION_SCREEN_ON和ACTION_SCREEN_OFF,但我不确定这是否正是我正在寻找的.
有任何想法吗?
另一种解决方案可以是调用
以一天的开始作为第一个参数,当前时间作为结束参数,然后过滤结果以仅检查
使用事件.Event.SCREEN_INTERACTIVE 使用事件.Event.SCREEN_NON_INTERACTIVE
事件
获取每个人的时间戳,并对每个人之间经过的所有时间求和
SCREEN_INTERACTIVE -> SCREEN_NON_INTERACTIVE
事件,这可以轻松显示屏幕交互的时间,因此屏幕打开并启用触摸。
您可能会遇到一个没有任何相关 SCREEN_NON_INTERACTIVE 事件的 SCREEN_INTERACTIVE 事件,此时
事件发生,幸运的是该事件位于 queryEvents 方法返回的同一个列表中
还记得声明并让用户允许 android.permission.PACKAGE_USAGE_STATS 权限,如此处所述
附:我还没有使用过这个,但是查看文档,它是正确的使用方式,可能是 android 设置 pps 使用的那个。另请参阅同一包中的其他事件,它们可能对您想要完成的任务有帮助
我知道这是一个老问题,但希望这会对某人有所帮助。
在我的服务中,我监听 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)
| 归档时间: |
|
| 查看次数: |
3115 次 |
| 最近记录: |