gpt4 book ai didi

android-lifecycle - 安卓 12 : Why doesn't swiping up trigger onStop()

转载 作者:行者123 更新时间:2023-12-05 04:36:35 26 4
gpt4 key购买 nike

在前景中,当我从屏幕最底部向上滑动时:

  • Android 10 (Nokia 6.1)、11 (Pixel 4):调用 onStop()。
  • Android 12 (Pixel 3):未调用 onStop()。

然后,如果您向上拖动/滑动应用屏幕以关闭(或销毁)它:

  • Android 10 (Nokia 6.1)、11 (Pixel 4):调用 onDestroy()。
  • Android 12 (Pixel 3):连续调用 onStop() 和 onDestroy()。

编译SDK 31最小SDK 26targetSDK 31

我调查了https://developer.android.com/about/versions/12/behavior-changes-all ,这里没有记录此行为。

这在 Android 12 中是预期的事情吗?这很烦人,因为它改变了应用程序及其事件/片段/协程的生命周期行为......

最佳答案

我尝试用谷歌搜索这个问题,但没有找到答案,所以经过一些调查后我发现我们可以依赖事件焦点:

class MainActivity : AppCompatActivity() {
override fun onWindowFocusChanged(hasFocus: Boolean) {
super.onWindowFocusChanged(hasFocus)
}
}

onWindowFocusChanged 在我们打开最近的应用程序 View (从屏幕底部向上滑动)时调用。但当您在应用程序中显示对话框或用户与屏幕顶部的通知进行交互时,它也会被调用。所以我想出了下一个解决方案:

class MainActivity : AppCompatActivity() {

override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(binding?.root)
binding?.root?.setOnApplyWindowInsetsListener(insetListener)
}

private fun onFocusLost() {
//your code
}

private fun onFocusTaken() {
//your code
}

//---- implementation details -----\\
private var unnecessaryFocusTriggerTimeStamp: Long = 0
private var recentAppsOpened = false
//insetListener is called when a user interacts with notifications (swipes them out)
private val insetListener = View.OnApplyWindowInsetsListener { _, insets ->
unnecessaryFocusTriggerTimeStamp = System.currentTimeMillis()
insets
}
//this method is called when a dialog is going to be shown
override fun onCreateView(name: String, context: Context, attrs: AttributeSet): View? {
unnecessaryFocusTriggerTimeStamp = System.currentTimeMillis()
return super.onCreateView(name, context, attrs)
}

override fun onWindowFocusChanged(hasFocus: Boolean) {
if (!hasFocus && !this.recentAppsOpened && (System.currentTimeMillis() - this.unnecessaryFocusTriggerTimeStamp) > 50) {
this.recentAppsOpened = true
onFocusLost()
} else if (hasFocus && recentAppsOpened) {
this.recentAppsOpened = false
onFocusTaken()
}
super.onWindowFocusChanged(hasFocus)
}
}

这段代码看起来不太好,但在 Pixel 5 和 Galaxy A52 (Android 12) 上运行良好。

生命周期如下所示:

[向上滑动]

  • 关于失焦
  • 暂停
  • 停止

[返回应用]

  • 开始
  • onResume
  • 在FocusTaken上

onFocusLostonFocusTaken代替onStoponStart

关于android-lifecycle - 安卓 12 : Why doesn't swiping up trigger onStop(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70800810/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com