Android前台服务启动的线程是否持久?

3
我需要一个24/7运行的服务,它具有以下功能:
(1) 每秒使用fusedLocationApi检查用户的GPS,以检查用户是否进入特定的地理围栏。
(2) 检查另一个应用程序包是否已安装(线程)。
(3) 每隔60秒钟向服务器发送一次保持连接的数据包(线程)。
这些线程是单例实例,因为我必须确保每个功能只运行一个线程,以节省电池寿命。
所有上述线程都在前台服务的onStartCommand中运行。我已经阅读过前台服务本身在大多数情况下不会停止,但线程呢?从前台服务启动的线程也是持久的吗?此外,如何测试证明它是持久的?
请帮忙!
1个回答

1

我将回答自己的问题。

经过大约一个月的观察和尝试,我最终得到了我想要的。

关于问题的答案是肯定的,但也是否定的。线程在待机模式下仍然活跃,但它们内部执行的操作被挂起。

我的前台服务有一个FusedLocationProviderClient,它以一分钟为间隔运行,还有一个线程,每六分钟进行ping服务器等其他操作。它们都不会停止,但是ping服务器的延迟非常大。本来应该每六分钟ping一次服务器,但是在待机模式下,延迟长达30分钟或更久,甚至超过一小时。

我采用了两种方法来解决这个问题。我不知道哪一种方法使这个问题得到了解决,但无论如何,它都可以工作。

(1) 启动时添加电池白名单。

        Intent intent = PowerSaverHelper.prepareIntentForWhiteListingOfBatteryOptimization(getContext(), getPackageName(), false);

        if (intent != null) {

            startActivityForResult(intent, 19810);

        } else {

            getInterval();
        }

(2) 在前台服务的 onStartCommand 中创建并持有一个部分 wakeLock。

        try {

            PowerManager powerManager = (PowerManager) getSystemService(POWER_SERVICE);
            wakeLock = powerManager.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK,
                    "MyService::GpsWakeLock");
            if (!wakeLock.isHeld()) {
                wakeLock.acquire();
            }

        } catch (Exception e) {
            ErrorController.showError(e);
        }

并在前台服务的onDestroy中释放它。

            if (wakeLock != null && wakeLock.isHeld()) {

                wakeLock.release();
            }

这个解决方案对我很有效。GPS每分钟获取一次位置(如果可以),并在准确的时间间隔内向服务器发送ping,即使设备没有连接到任何电源也能在过夜期间工作。
但是,这种方法的缺点是可预见的。电池会耗尽。通过Battery Historian查看时,我发现前台服务正在运行时CPU始终处于唤醒状态。即使删除了GPS功能(它会消耗大量电池),在一个小时的测试中仍然消耗了约0.7%的电池。
但是,如果您的目标与我的相似,即特殊用途应用程序应该是持久的,那么这种方法可能有所帮助。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接