跟踪视图添加到WindowManager(没有findViewById()函数?)

Jes*_*sta 17 android view android-windowmanager

在我的服务我视图添加到WindowManageraddView().当我准备隐藏视图时,我removeView()使用View引用调用.这很有效 - 大部分时间.

我偶尔会有Force Close报告说View没有附加到WindowManager.这是有道理的.问题是,我认为该服务正在被Android杀死,当它是时候隐藏视图时,它会尝试删除错误的View View.

我已经尝试检查View是否为null,但显然它不是在这一点上,它根本就不是附加到的那个WindowManager.似乎如果View参考丢失,则无法再次访问它.

我怎样才能获得findViewById()WindowManager自身相同的东西?如果我的服务被停止(被杀),会View自动删除WindowManager吗?有没有办法我可以存储引用,View以便如果服务停止我仍然可以删除View后者(我也试图避免泄漏View)?

kev*_*vin 11

在我的服务中,我使用addView()向WindowManager添加一个视图.当我准备隐藏视图时,我使用View引用调用removeView().这很有效 - 大部分时间.我偶尔会有Force Close报告,说View没有附加到WindowManager.

我现在正在遇到一模一样的问题.希望专家能够参与其中.

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

保持对已添加的视图的引用,只需使用removeView(mView).

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

WindowManager.LayoutParams params = ...
mView = new View(this);
WindowManager wm = (WindowManager) getSystemService(WINDOW_SERVICE);
wm.addView(mView, params);
Run Code Online (Sandbox Code Playgroud)

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

WindowManager wm = (WindowManager) getSystemService(WINDOW_SERVICE);
try {
    wm.removeView(mView);
} catch (Exception e) {}
Run Code Online (Sandbox Code Playgroud)

如果我的服务被停止(被杀死),View会自动从WindowManager中删除吗?

根据我的经验,当服务被杀死时,它们将被删除.您可以通过在不删除视图的情况下停止服务来测试此操作.不知道为什么会有效.

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

如果你解决了这个问题,请告诉我.


小智 5

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