在NativeScript应用中获取Android WakeLock

时间:2018-08-18 21:05:27

标签: android nativescript nativescript-angular

我几乎完成了一个NativeScript应用程序,该应用程序将计时器集成为UI的一部分。 (我重复一遍,一个NativeScript应用程序。NativeScript有点像React Native。它是用JavaScript而不是Java编写的。)用户将创建一个计时器,该计时器的运行时间约为100分钟,但可能只运行1秒。期望确保在此过程结束时都会发出警报,无论他们是否一直在使用手机。当我在手机上运行该应用程序时,在手机屏幕锁定了一段时间后(我不确定确切需要多长时间,但大概需要10-30分钟),警报不会响起,并且应用程序会重新启动以主页。理想情况下,我希望完全保留应用程序的状态,并在屏幕关闭时继续在Angular组件中进行的处理。是的,我知道这会浪费电池寿命。

现在,我用于在Android中强制执行部分唤醒锁的代码如下:

acquireWakeLock() {
    //enforce a new partial wake lock
    const PowerManager = android.os.PowerManager;
    let powerManager = <PowerManager>application.android.context.getSystemService(android.content.Context.POWER_SERVICE);
    this.wakelock = <PowerManager.WakeLock>powerManager.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "RoutineTimer");
    this.wakelock.acquire();
    console.log("Acquired new wake lock");
}

(请原谅详细的引用,但我将其放在此处以区分“ android”和“ application.android”。)

这根本达不到预期的效果。它是从Angular组件中调用的,但位于Angular服务中。

有人知道这是怎么回事还是有其他建议?我不希望使用完整的(屏幕)唤醒锁,尽管我知道有一个插件。出于经济原因,我也不想从服务器发送任何形式的广播。

1 个答案:

答案 0 :(得分:0)

好吧,我想出了如何执行唤醒锁的方法,但要注意的是,它现在并不十分有用(而且会很浪费,所以我不再使用这种方法了。)

如果您想使用Android唤醒锁,则必须将此代码放在 Android 服务中,而我的代码只是在Angular服务中(使用类同时充当)。我以为可以在代码库中的任何地方完成此操作,因此就是问题所在。

最后一个答案here给出了有关如何使用TypeScript启动Android服务(我在实际文档中找不到)的扎实描述。上面的代码几乎可以直接放在那里。

我认为更好的方法可能是使用AlarmManager,但是我仍然不知道如何保持某种跨平台方法并从Java代码中执行NativeScript JS代码。理想情况下,将有一个NativeScript插件可以在任意时间处理计划任务。

无论如何,我现在的解决方案是使用nativescript-local-notifications插件并在特定时间安排通知。不幸的是,尚不支持在收到通知时执行代码(但这是功能请求)。