我正在尝试使用我的第一个应用程序(理论上)做一些简单的事情,但我需要一些帮助才能开始。我想构建一个应用程序,告诉我今天Nexus 4上的屏幕有多长时间了。
Android向我显示自上次充电以来屏幕已经显示的设置>电池>屏幕,但我不知道如何解析这些数据,或者如何将其限制在当天。 到目前为止我的研究表明,batterystats.bin参与了上面概述的屏幕跟踪,我可以使用ACTION_SCREEN_ON和ACTION_SCREEN_OFF,但我不确定这是否正是我正在寻找的。 p >
有什么想法吗?
答案 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)
另一种解决方法是致电
将一天的开始作为第一个参数,将当前时间作为结束参数,然后过滤结果以仅检查
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;
}
}
}