【问题标题】:How to check whether my app has lost focus?如何检查我的应用程序是否失去焦点?
【发布时间】:2020-01-30 23:28:58
【问题描述】:

我是编码新手,我想知道是否有办法检查应用何时失去焦点(从前台转到后台)。

onLosefocuslistener之类的吗?

澄清我不希望活动失去焦点。我想当整个应用程序进入后台时,要么导致用户按下“主页”按钮,要么另一个应用程序进入前台。

【问题讨论】:

标签: java android


【解决方案1】:

您可以在 Application 类中注册活动生命周期回调。

见:

https://developer.android.com/reference/android/app/Application.ActivityLifecycleCallbacks

https://developer.android.com/reference/android/app/Application#registerActivityLifecycleCallbacks(android.app.Application.ActivityLifecycleCallbacks)

然后,您可以简单地设置一个计数器,该计数器在活动开始时递增,在活动停止时递减。如果计数器的值为零,则当前在前台没有活动。

【讨论】:

    【解决方案2】:

    这并不容易完成,但有一些轻量级库可以轻松完成您想要的工作。

    我正在使用this one,效果非常好。

    【讨论】:

      【解决方案3】:

      Kotlin 中的示例:

      import java.io.Closeable
      import kotlinx.coroutines.channels.Channel
      import kotlinx.coroutines.runBlocking
      import androidx.lifecycle.*
      
      class AppLifecycleService() : LifecycleObserver, Closeable {
      
          val channel = Channel<Boolean>()
      
          init {
              ProcessLifecycleOwner.get().lifecycle.addObserver(this)
          }
      
          @OnLifecycleEvent(Lifecycle.Event.ON_START)
          fun onMoveToForeground() {
              runBlocking { channel.send(true) }
          }
      
          @OnLifecycleEvent(Lifecycle.Event.ON_STOP)
          fun onMoveToBackground() {
              runBlocking { channel.send(false) }
          }
      
          override fun close() {
              ProcessLifecycleOwner.get().lifecycle.removeObserver(this)
              channel.close()
          }
      }
      

      在某处实例化该类,并订阅该频道。当您获得和失去焦点时,它将向您发送真/假。当您的应用完成后,close() 对此类的引用。

      【讨论】:

        猜你喜欢
        • 2010-09-07
        • 1970-01-01
        • 2011-04-12
        • 1970-01-01
        • 2013-08-07
        • 2011-08-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多