android - 删除任务时如何停止前台服务?
问题描述
我试图在应用程序退出时停止服务,但它会继续运行一两分钟。
这是我依赖的代码:
override fun onTaskRemoved(rootIntent: Intent?) {
stopSelf()
super.onTaskRemoved(rootIntent)
}
如果我要通过单击按钮手动停止它然后退出应用程序一切正常。我可以看到该进程立即在 android studio 中退出。
MainActivity 中的按钮监听器:
binding.mainBtn.setOnClickListener {
isConnected = if(!isConnected && checkPermission()) {
startService(Intent(this, MyForegroundService::class.java))
binding.mainBtn.setImageResource(R.drawable.ic_baseline_stop_24)
true
} else {
stopService(Intent(this, MyForegroundService::class.java))
binding.mainBtn.setImageResource(R.drawable.ic_baseline_play_arrow_24)
false
}
}
清单文件如下所示:
<service
android:name=".services.MyForegroundService"
android:enabled="true"
android:exported="false"
android:foregroundServiceType="microphone"/>
解决方案
好吧,android studio中的“停止应用程序”并没有变灰,我可以在应用程序终止前继续分析应用程序一两分钟
您的进程仍在运行。没有要求将任务从概览屏幕上滑出会终止您的进程,或者在所有情况下都会这样做。
在这两种情况下 stopService 都会运行,我期望相同的行为
唉,这是一个不切实际的期望。
当用户将任务滑出概览屏幕时,许多设备将终止您的应用程序的进程,如果出现以下情况:
- 您当时没有运行前台服务,或者
- 你这样做了,但是你停止了前台服务
onTaskRemoved()
但是,这并不能保证。其他模式包括 OnePlus 正在做什么,即使您在onTaskRemoved()
. 这是 OnePlus 的决定,因为这是他们的设备。同样,其他制造商可以为所欲为。我们已经看到制造商终止了您的应用程序的进程,即使您正在运行前台服务。我们已经看到制造商在设置中执行了相当于“强制停止”的操作,因此您应用的所有警报和作业都会被清除(以及其他影响)。等等。
总体而言,当用户将任务滑出概览屏幕时,尽量不要对应用行为做出假设。
推荐阅读
- awk - 如何提取文档的一部分并将其保存到新文档(命令行 Mac)
- firebase - onCall firebase 云功能的 CORS 问题(GCP 防火墙规则)
- apollo - 在节点中使用阿波罗 - (无反应)
- python - 过滤布尔字段
- python - Librosa - 如何为立体声音频创建梅尔频谱图?
- scala - 类加载器在使用 foreach 时为 None 加载一个类
- powershell - 如何动态调用具有相同参数的 2 个不同的 cmdlet?(不是动态参数。)
- reactjs - 下拉状态未保留在 React 中
- python - 设置变量等于 sqlite3+Python 数据库条目
- c# - 在 Windows 虚拟桌面 (WVD) 中获取当前登录用户