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.")
}
}
就这些了,希望对大家有帮助^-^
我目前正在开发一个 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.")
}
}
就这些了,希望对大家有帮助^-^