Android服务

时间:2016-12-29 09:08:47

标签: android multithreading service scheduler

我有一个驱动程序(Android HAL)和一个通过unix socket相互通信的服务。它们都有一个线程来维持心跳连接。 HAL是套接字守护程序,服务是套接字客户端。

HAL在启动时加载。应用程序绑定时加载服务。这个应用程序没有做任何其他事情。

我观察到只要App可见,客户端和守护进程线程就可以了。但是当我将应用程序推送到后台时(例如,通过按下主页按钮),我会在守护程序线程报告的客户端线程中观察到一堆超时(因为心跳的发送速度不够快)。

我做了一些计时测量,发现只要app可见,Service就行为正常,但是当app不可见时,服务线程表现不正常。它几乎就像调度程序不经常在服务中执行线程一样。

此时,Android系统上没有其他应用。

此行为已通过Nexus 7(2013)和运行Android N的运行M和Nexus Player的Ne​​xus 5X验证

如果应用程序启动服务,而不是绑定到它,则错误的线程调度仍然存在。唯一不同的是,现在App可见性状态不会影响服务线程执行(它总是很慢。)

有没有办法让服务线程运行得更快?

主要是,线程只执行select()调用10ms,然后在循环中进行一些簿记。 psuedo-code如下:

while(running) {
    if not_connected {
        connect()
    }
    if send_heartbeat_timeout_elapsed
        send_heartbeat()
    }
    if recv_heartbeat_timeout_elapsed {
        close_connection()
    }
    if connected {
        wait_for_daemon_msg(10 ms) 
        if msg_received {
            process_msg()
        }
    }
}

编辑1: 或许有用的是,在最终系统中,我需要能够开始"启动服务,应该没有应用程序。我需要服务线程在这种情况下正确执行。

编辑2: 发现如果我将我的服务作为"前台服务",则此调度问题会消退。

我感到困惑的是服务流程'优先级不足以允许它足够频繁地执行,即使在其他低CPU负载下也是如此。理想情况下,我不应该这样做。

暂时提出问题,以防弹出有用的答案。

1 个答案:

答案 0 :(得分:0)

只要我需要我的服务及时执行,我就会创建并保留一个通知图标。

这对手机/平板电脑版本和Android TV版本都有帮助,即使电视没有显示通知图标。从通知中删除图标时,服务会变慢。

我后来考虑过这一点,并意识到可能没有及时提供后台任务的服务,但也没有通知图标/控件。例如。在后台播放的音乐播放器通常会在通知中保留控件。

如果有人找到了更好的解决方案,请将其曝光。