android - 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
随时运行,而不需要应用程序在前台运行。我应该创建一个服务来在后台运行侦听器还是让侦听器自行在后台运行?
解决方案
您需要将侦听器移动到Service
独立运行的位置。该服务已经在“后台”中,因此您不需要创建额外的线程。此外,从您发布的内容来看,没有阻塞代码的代码,您的所有事件都将以回调方式发送。
推荐阅读
- javascript - 从 HTML 无序列表创建数组
- python - 将下拉选择传递给 Flask/Python 函数
- javascript - 我如何“交换”谷歌地图字体以避免谷歌页面速度洞察警告?
- lookup - Informatica 查找字符串模式匹配
- ios - 捕捉图像方向问题
- python - 如何设置小部件以链接到 jupyternotebooks 的数组
- javascript - 在 html5 画布中渲染大量元素
- java - Oracle 数据库中 Java 的 TLS 版本
- neo4j - 如何在 Cypher 中合并然后排序两个列表?
- python - Python 和 Pandas 使用数据框创建多个动态 Excel 表