【问题标题】:Acquiring an Android WakeLock in NativeScript App在 NativeScript 应用程序中获取 Android WakeLock
【发布时间】:2018-08-18 21:05:26
【问题描述】:

我几乎完成了一个将计时器集成为 UI 一部分的 NativeScript 应用程序。 (我再说一遍,一个 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 服务中。

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

【问题讨论】:

    标签: android nativescript nativescript-angular


    【解决方案1】:

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

    如果您想使用 Android 唤醒锁,则必须将此代码放在 Android 服务中,而我的只是在 Angular 服务中(似乎没有问题两者兼而有之)。我认为它可以从代码库中的任何地方完成,因此出现了问题。

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

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

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

    【讨论】:

    • 这方面有什么进展吗?我想每 10 分钟从一个 IP 轮询一次,而 FCM 的要求(域名、SSL)似乎有点太多了。
    • @inf3rno 不是真的。不过,我已经很长时间没有研究它了,所以现在可能会有更好的解决方法。 nativescript-task-dispatcher 插件看起来可能对计划任务有用
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多