首页 > 解决方案 > 删除任务时如何停止前台服务?

问题描述

我试图在应用程序退出时停止服务,但它会继续运行一两分钟。

这是我依赖的代码:

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"/>

标签: androidandroid-studiokotlin

解决方案


好吧,android studio中的“停止应用程序”并没有变灰,我可以在应用程序终止前继续分析应用程序一两分钟

您的进程仍在运行。没有要求将任务从概览屏幕上滑出会终止您的进程,或者在所有情况下都会这样做。

在这两种情况下 stopService 都会运行,我期望相同的行为

唉,这是一个不切实际的期望。

当用户将任务滑出概览屏幕时,许多设备将终止您的应用程序的进程,如果出现以下情况:

  • 您当时没有运行前台服务,或者
  • 你这样做了,但是你停止了前台服务onTaskRemoved()

但是,这并不能保证。其他模式包括 OnePlus 正在做什么,即使您在onTaskRemoved(). 这是 OnePlus 的决定,因为这是他们的设备。同样,其他制造商可以为所欲为。我们已经看到制造商终止了您的应用程序的进程,即使正在运行前台服务。我们已经看到制造商在设置中执行了相当于“强制停止”的操作,因此您应用的所有警报和作业都会被清除(以及其他影响)。等等。

总体而言,当用户将任务滑出概览屏幕时,尽量不要对应用行为做出假设。


推荐阅读