18

在我的服务中,我添加了一个视图WindowManagerwith addView()。当我准备好隐藏视图时,我会removeView()使用View引用进行调用。这很好用——大多数时候。

我偶尔会收到强制关闭报告说视图未附加到WindowManager. 这是有道理的。问题是我认为该服务正在被 Android 杀死,当隐藏视图时,它会尝试在错误的View.

我已经尝试检查 View 是否为空,但显然它不是在这一点上,它根本不是附加到WindowManager. 似乎如果 View 引用丢失,则无法再次访问它。

我怎样才能得到本身的等价findViewById()WindowManager?如果我的服务停止(终止) ,是否会View自动删除?WindowManager有没有办法可以存储对的引用,View这样如果服务停止,我仍然可以删除View后者(我也试图避免泄漏View)?

4

4 回答 4

11

在我的服务中,我使用 addView() 向 WindowManager 添加了一个视图。当我准备好隐藏视图时,我使用 View 引用调用 removeView()。这很好用——大多数时候。我偶尔会收到强制关闭报告说视图未附加到 WindowManager。

我现在正在遇到一模一样的问题。希望高手指点一下。

如何在 WindowManager 本身上获得相当于 findViewById() 的功能?

保留对添加的视图的引用,只需使用 removeView(mView)。

目前在我的服务中,添加视图:

WindowManager.LayoutParams params = ...
mView = new View(this);
WindowManager wm = (WindowManager) getSystemService(WINDOW_SERVICE);
wm.addView(mView, params);

然后为了删除视图,我通过捕获异常来避免偶尔的 FC:

WindowManager wm = (WindowManager) getSystemService(WINDOW_SERVICE);
try {
    wm.removeView(mView);
} catch (Exception e) {}

如果我的服务停止(终止),视图是否会自动从 WindowManager 中删除?

根据我的经验,当服务被终止时,它们会被删除。您可以通过停止服务而不删除视图来测试这一点。不知道为什么会这样。

我担心的是,当我去删除视图时,我对 WM 的第二次引用是不同的。如果是这种情况,当我捕捉到异常时,mView 是否仍在显示?当我添加视图时,我会尝试保留对 WM 的引用,但是我遇到了一些问题,即对系统服务的引用随着时间的推移似乎变坏了。

让我知道你是否解决了这个问题。

于 2011-07-22T22:45:20.603 回答
5

要检查视图是否已成功附加到 Windows 管理器,或者仍然附加,您可以使用view.isShown();.

于 2015-04-22T01:05:27.127 回答
2

在尝试删除视图之前检查视图父级!= null。

if(mView.getParent() != null){
   wm.removeView(mView);
}
于 2016-05-04T17:33:21.017 回答
2

您还可以使用:

ViewCompat.isAttachedToWindow(mView);

根据文档:

如果提供的视图当前附加到窗口,则返回 true。

于 2016-12-15T11:05:56.507 回答