一个自定义的View可以知道onPause被调用了吗?

我有一个自定义视图运行一个线程操作,周围打电话给interwebs定期。 我想知道是否有一种方法让我不必从父Activity(onPause)中删除该线程,以便在Activity被禁用(和/或终止)之后线程不会在后台碾磨。

这里的意图是自定义视图是自给自足的,不需要额外的处理。 做到这一点的方法是让它监听父母的后台时间,然后让线程中的无限睡眠循环过期。 我没有办法做到这一点,但我希望我可以忽略一些东西。

Solutions Collecting From Web of "一个自定义的View可以知道onPause被调用了吗?"

除非你直接通知它。

为了你的目的,重写View.onDetachedFromWindow()并放弃你的线程。 然后,当视图再次可见时,将Thread旋转回View.onAttachedToWindow() 。 onPause()和onResume()的问题在于,您仍然可以在屏幕上看到一个可见的视图,但该视图会附加到暂停的活动。 这种情况发生的一个例子是,如果你在一个覆盖另一个的窗口中有一个活动。

或者,正如威廉·古维(william gouvea)所build议的那样,片段可能更适合你的目的,因为它已经具有暂停和恢复的生命周期挂钩,而任何与networking对话的东西无论如何都落在控制器领域。

是的,你可以使用下面的代码,

 @Override protected void onVisibilityChanged(@NonNull View changedView, int visibility) { super.onVisibilityChanged(changedView, visibility); if (visibility == View.VISIBLE) //onResume called else // onPause() called } @Override public void onWindowFocusChanged(boolean hasWindowFocus) { super.onWindowFocusChanged(hasWindowFocus); if (hasWindowFocus) //onresume() called else // onPause() called } @Override protected void onDetachedFromWindow() { super.onDetachedFromWindow(); // onDestroy() called } @Override protected void onAttachedToWindow() { super.onAttachedToWindow(); // onCreate() called } 

如果你简单地重写View类并创build你自己的CustomView,你可以创build一个接口作为一个监听器,这个监听器应该由你的父活动来实现,所以当事情发生的时候你触发事件并且在这些组件之间来回地build立通信。

根据你想要达到的目的,Fragments可能是有用的,因为这个组件有自己的生命周期,类似于活动(例如onPause / onResume),拥有你自己的状态,有或没有一个视图,并且可以保持configuration之间的状态。

更多信息请参阅: http : //developer.android.com/reference/android/app/Fragment.html http://developer.android.com/guide/components/fragments.html

要么你必须让你的视图知道拥有的Activity不再处于前台,或者用某种方法来查询系统,以查询当前哪个任务处于前台,这看起来非常低效。

以下是解决此问题的两个链接:

  • 如何检查活动是在前景还是在可见的背景?
  • 检查Android应用程序是否在后台运行

(这可能不是一个真正的答案,但对于评论太大了)