高级问题是我想知道用户过去是否在某个特定时间段内。这可以通过跟踪USER_IDLE
和USER_PRESENT
事件在计算机处于唤醒状态时解决。
但是,我发现当笔记本电脑盖关闭时,它不会触发USER_IDLE
事件,也不会在笔记本电脑盖打开时触发USER_PRESENT
。笔记本电脑可以关闭数小时,也不会发送任何事件。
那我怎么知道用户是否在场?我已经研究了各种各样的事件来捕获被暂停的笔记本电脑,包括SUSPEND
,DEACTIVATE
等,但没有一个能按我的意愿行事。
例如,我有这个测试代码:
var logFile:File = File.documentsDirectory.resolvePath("events.log");
var app:NativeApplication = NativeApplication.nativeApplication;
app.addEventListener(Event.USER_IDLE, logEvent);
app.addEventListener(Event.USER_PRESENT, logEvent);
app.addEventListener(Event.SUSPEND, logEvent);
app.addEventListener(Event.EXITING, logEvent);
app.addEventListener(Event.ACTIVATE, logEvent);
app.addEventListener(Event.DEACTIVATE, logEvent);
app.addEventListener(InvokeEvent.INVOKE, logEvent);
logEvent(new Event("started"));
function logEvent(e:Event):void {
var log:String = "\n" + e.type + " at " + new Date();
var fileStream:FileStream = new FileStream();
fileStream.open(logFile, FileMode.APPEND);
fileStream.writeUTFBytes(log);
fileStream.close();
}
如果我运行此应用程序,将窗口焦点改回然后再关闭,关闭笔记本电脑,然后打开笔记本电脑,我得到此输出:
started at Tue Sep 1 09:29:11 GMT-0400 2015
invoke at Tue Sep 1 09:29:11 GMT-0400 2015
activate at Tue Sep 1 09:29:12 GMT-0400 2015
deactivate at Tue Sep 1 09:29:13 GMT-0400 2015
activate at Tue Sep 1 09:29:13 GMT-0400 2015
deactivate at Tue Sep 1 09:29:17 GMT-0400 2015
activate at Tue Sep 1 09:29:31 GMT-0400 2015
正如您所看到的,这似乎无法帮助我弄清楚用户是否在场(笔记本电脑处于清醒状态)。没有USER_IDLE
或USER_PRESENT
个事件,即使用户在场,也会发生ACTIVATE
和DEACTIVATE
个事件。
有没有办法知道笔记本电脑是否被暂停?或者知道用户是否在场?
编辑:我想我可以轮询系统时钟。一段时间的大幅跳跃表明在暂停一段时间后醒来。我会试试这个。