作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
在前景中,当我从屏幕最底部向上滑动时:
然后,如果您向上拖动/滑动应用屏幕以关闭(或销毁)它:
编译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) 上运行良好。
生命周期如下所示:
[向上滑动]
[返回应用]
用onFocusLost
和onFocusTaken
代替onStop
和onStart
。
关于android-lifecycle - 安卓 12 : Why doesn't swiping up trigger onStop(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70800810/
我是一名优秀的程序员,十分优秀!