Android 前台服务()问题

Android Foreground Service() issue

mWindowManageronDestroy 寻址 lateinit property mWindowManager has not been initialized 中抛出错误。但是明明已经在onStartCommand里面初始化了。 我从一个 activity 开始这个前台服务,然后被销毁。所以这项服务 运行 是独立的。当用户想要销毁服务时 he/she 必须打开应用程序并从 activity 销毁它。此问题仅来自某些设备,我对导致此错误的原因感到困惑。有人可以帮我吗?

class PremiumService : BaseService(), View.OnClickListener {

  private lateinit var mWindowManager: WindowManager

  override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int {

    mWindowManager = getSystemService(Context.WINDOW_SERVICE) as WindowManager
    mWindowManager.addView(mFloatingView, params)

    return START_STICKY
  }

  override fun onDestroy() {

    mWindowManager.removeView(mFloatingView)
    super.onDestroy()
  }
}
  1. 为什么不在赋值中初始化 mWindowManager?

private val mWindowManager = getSystemService(Context.WINDOW_SERVICE) as WindowManager

  1. 如果你需要使用lateinit var,你应该检查初始化状态:

if (::mWindowManager.isInitialized) mWindowManager.removeView(mFloatingView)

  1. 不建议在 onDestroy() 中为服务添加任何逻辑,因为您无法确定它是否被调用。

  2. 您不需要删除视图,因为当服务 finished/killed.

    时它们会自动删除
  3. 我写了 a few articles about floating windows on Android. As the author of Floating Apps,我对此有所了解,相信我,对于某些设备来说,奇怪且绝对不可预测的行为是正常的。


问题说明:

您的服务可能会在某些情况下(内存不足等)重新启动,并且由于您不想重新交付(您只有 START_STICK),您 onStartCommand 不会被调用.