如何检测视图的父活动是否被销毁

8

当Activity被销毁时,我希望在View中进行一些清理工作。有没有办法在Activity销毁时,在View中获取回调?我尝试使用onDetachedFromWindow,但我不确定这是否正确。

3个回答

8

如果您想要在不过载 View.onDetachedFromWindow() 方法的情况下获得回调,您可以使用 View.addOnAttachStateChangeListener() 方法,并将回调侦听器作为单个参数传递。


1

在理解onDestroy方法不能保证被调用的前提下,你可以在Activity的onDestroy方法中回调到你的视图。

针对评论的编辑:

你可以通过在布局中为视图设置id并调用findViewById来获取任何视图。以下是一个示例:

Layout.xml(仅显示最少内容)

<LinearLayout>
  <com.example.superwidget.DropDownTouchEnabledListView
    android:id="@+id/special_list_view" />
</LinearLayout>

MyActivity.java(再次,最简单的形式并假设正确的导入)

@Override
void onDestroy() {
    DownTouchEnabledListView v = (DownTouchEnabledListView)findViewById(R.id.special_list_view);
    v.doCallback(with, parameters);
}

你能详细说明一下吗?我的自定义视图类是独立包的一部分,而且这个视图是在布局xml中定义的。因此,从活动类调用视图上的某些内容是不可行的。 - bhups
2
“因此,从活动类中调用视图上的某些内容是不可行的。” 当然可以。调用findViewById(),获取小部件,将其转换为适当的类,并在其上调用方法。话虽如此,对我来说,“onDetachedFromWindow()”似乎是一个合理的选择。 - CommonsWare
@CommonsWare 你的评论比我编辑得快。:) 顺便说一下,感谢你所做的所有工作。你的书籍/代码/答案对我来说非常宝贵。 - Jere.Jones
@CommonWare:我正在编写一个包含自定义视图的库,与编写Android应用程序不同。因此,我无法控制Activity类代码。 - bhups
在这种情况下,除非它引起问题,否则请坚持使用onDetachedFromWindow() - CommonsWare

1

由于View包含Context,因此我使用LocalBroadcastManager。到目前为止,我还没有遇到任何问题。

View正在监听destroy event filter。然后,Activity只需要广播destroy event即可。

// On View `setup` function
LocalBroadcastManager.getInstance(context).registerReceiver(receiver, filter)

// On Activity
override fun onDestroy() {
    super.onDestroy()
    LocalBroadcastManager.getInstance(this).sendBroadcast(intent)
}

不要忘记在触发销毁事件后取消注册 事件过滤器

presenter.destroy() // Your clean-up code here
LocalBroadcastManager.getInstance(this).unregisterReceiver(receiver)

您可以在这里找到有关LocalBroadcastManager的更多详细信息:


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接