android PhoneStateListener 运行 是否在后台?

Does android PhoneStateListener run on background?

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

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

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

我现在的想法是这样的:

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 在任何时候都处于 运行ning 状态,而不需要应用程序在前台处于 运行ning 状态。 我应该为 运行 后台监听器还是单独为后台监听器 运行 创建服务?

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

好的,我已经解决了这个问题。

简短的回答是没有PhoneStateListener 不会在后台运行。 默认情况下,侦听器 运行 仅当应用程序处于我所见的前台时。

也许有一种方法可以在服务中 运行 它,但我无法让它工作。 相反,我用 BroadcastReceiver.

解决了这个问题

所以,对于解决方案

CallStateMonitor 和以前一样,我只是把它从原来的地方移走了。 对于服务,正如我所说,我将其替换为广播接收器:

class CallBroadcastReceiver : BroadcastReceiver() {

  override fun onReceive(context: Context?, intent: Intent?) {
    val telephonyManager = context?.getSystemService(TELEPHONY_SERVICE) as TelephonyManager
    val monitor = StateMonitor()
    telephonyManager.listen(monitor, LISTEN_CALL_STATE)
  }

  private val tag = "STATE_MONITOR"

  private inner class StateMonitor : PhoneStateListener() {
    override fun onCallStateChanged(state: Int, phoneNumber: String?) {
      when (state) {
        TelephonyManager.CALL_STATE_IDLE -> Log.d(tag, "IDLE")
        TelephonyManager.CALL_STATE_OFFHOOK -> Log.d(tag, "OFF-HOOK")
        TelephonyManager.CALL_STATE_RINGING -> Log.d(tag, "RINGING")
      }
    }
  }
}

剩下的只是从主activity:

启动接收器
class CallMonitorActivity : AppCompatActivity() {
  override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_main)
    registerReceiver(CallBroadcastReceiver(), IntentFilter(ACTION_CONFIGURATION_CHANGED))
    Log.d(ACTIVITY_TAG, "Registered call receiver.")
  }
}

就这些了,希望对大家有帮助^-^