首页 > 解决方案 > android PhoneStateListener 是否在后台运行?

问题描述

我目前正在开发一个 android 应用程序来监视来自电话的传入和传出呼叫并将呼叫信息注册到一个文件中,并且从我所读到的内容PhoneStateListener似乎可以满足我的需要。

问题是我需要应用程序在后台运行并且我正在考虑为此使用服务,但是我发现的每个使用侦听器的示例都在主要活动中声明它,所以我不确定是否需要创建一个服务,让它在后台运行。

对于更多上下文,我有具体说明,我无法创建应用程序来“替换”默认调用应用程序,因此创建 GUI 并没有太多用处(我知道应用程序需要一个主要活动,但它只是功能应该启动监视器)。

我现在的想法是这样的:

class CallMonitorService : Service() {
  private lateinit var serviceLooper: Looper
  private lateinit var serviceHandler: ServiceHandler
  private lateinit var monitor: StateMonitor

  private inner class ServiceHandler(looper: Looper) : Handler(looper) {
    override fun handleMessage(msg: Message) {...}
  }

  override fun onCreate() {
    Log.d(serviceName, "Created")
    HandlerThread("ServiceStartArguments", Process.THREAD_PRIORITY_BACKGROUND).apply {
      start()
      // Get the HandlerThread's Looper and use it for our Handler
      serviceLooper = looper
      serviceHandler = ServiceHandler(looper)
      val manager = getSystemService(TELEPHONY_SERVICE) as TelephonyManager
      manager.listen(StateMonitor(), PhoneStateListener.LISTEN_CALL_STATE | ...)
    }
  }
  ...
}

class StateMonitor : PhoneStateListener() {
  // Handler methods
}

因此,作为总结,我需要PhoneStateListener随时运行,而不需要应用程序在前台运行。我应该创建一个服务来在后台运行侦听器还是让侦听器自行在后台运行?

标签: androidkotlinandroid-servicephone-state-listener

解决方案


您需要将侦听器移动到Service独立运行的位置。该服务已经在“后台”中,因此您不需要创建额外的线程。此外,从您发布的内容来看,没有阻塞代码的代码,您的所有事件都将以回调方式发送。


推荐阅读