添加链接
link管理
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接

关键词:自定义View、custom View、Lifecycle、onPause、onResume

先说结论,可以。

在自定义 View 的类中,根据手机系统版本,重写 onVisibilityChanged() 或者 onVisibilityAggregated() 方法即可。详细判断条件见下文。

如果 Build.VERSION.SDK_INT < Build.VERSION_CODES.N (手机系统低于 Android 7.0)

1
2
3
4
5
6
7
8
9
@Override
protected void onVisibilityChanged(@NonNull View changedView, int visibility) {
super.onVisibilityChanged(changedView, visibility);
if (visibility == View.VISIBLE) { //onResume() 被调用
//处理动画播放、线程启动、开启定时任务等操作
} else { // onPause() 被调用
//处理动画的暂停、取消或者线程的暂停、取消、定时任务的暂停、取消等
}
}

然后 Build.VERSION.SDK_INT >= Build.VERSION_CODES.N (手机系统 Android 7.0 及以上)

1
2
3
4
5
6
7
8
9
@Override
public void onVisibilityAggregated(boolean isVisible) {
super.onVisibilityAggregated(isVisible);
if (isVisible) { //onResume() 被调用
//处理动画播放、线程启动、开启定时任务等操作
} else { // onPause() 被调用
//处理动画的暂停、取消或者线程的暂停、取消、定时任务的暂停、取消等
}
}

上述方案是我翻 Android 源码找到的最简单的方式,灵感来自 ProgressBar 。不需要监听所在 Fragment 或者 Activity 的生命周期。

其他方案参见: Can a custom View know that onPause has been called?

更新:2023-02-16

使用 Lifecycle 的方案中,除了直接通过 addObserver() 来被动接收回调外,也可以在需要的地方使用 Lifecycle.getCurrentState().isAtLeast(RESUMED) 方法来主动判断当前 Activity|Fragment 的状态。

其中 Lifecycle 可以通过 Activity|Fragment 的 getLifecycle() 方法获取,在 View 视角,Lifecycle 具备通用性,可以进行一定抽象。

如果有什么建议或者问题可以随时联系我,共同探讨学习:

  • Github: likfe
  • CSDN: 他叫自己Mr.张
  • 掘金: cafeting
  • 微博: cafeting
  •