以下工作代码在接收BOOT_COMPLETED广播的BroadcastReceiver中运行。
//Create a transparent, untouchable view and attach it to the system-level Window Manager
//We will force this overlay into Landscape orientation.
final View view = new View(context);
int dimension = 0;
int pixelFormat = PixelFormat.TRANSLUCENT;
final WindowManager.LayoutParams params = new WindowManager.LayoutParams(
dimension, dimension,
WindowManager.LayoutParams.TYPE_SYSTEM_OVERLAY,
WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL
| WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE,
pixelFormat);
params.screenOrientation = ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE;
final WindowManager wm = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);
wm.addView(view, params);
这是为了强制设备进入横向模式以供专门使用(不在Android市场上部署。这只能在我的设备上使用。)
我的问题是,叠加层偶尔会消失。似乎没有具体原因。它来自应用程序,有时看似随机。这会将其设置回纵向模式并导致问题。
有没有办法可以阻止或监视它并在视图发生时重新附加视图?
目标设备正在运行4.0.3
答案 0 :(得分:1)
可能会发生的事情是,由于您的View附加在BroadcastReceiver中,因此应用程序本身会在其余时间“停止”,当Android决定需要内存时,请直接停止。这实际上可能不是原因,因为您确实有一个View总是显示,但由于它不是Activity的一部分,系统可能会以不同的方式处理它。
说到这就是我要做的事情:
对您首选的View类进行子类化并覆盖onDetachedFromWindow()
,以便在调用方法时进行日志/打印。如果在调用此奇数叠加消失时onDetachedFromWindow()
被调用,则确定将视图重新添加到WindowManager的方法。您可以发送广播以由BroadcastReceiver拾取,或创建类似Listener
的接口来分派已分离的事件。然后,界面将由应用程序的长期运行部分(服务)实现。
当覆盖图消失时,您还可以看到OrientationEvenListener
是否有任何有趣的事情。
如果所有其他方法都失败了,您可以定期重新添加View。不是最佳解决方案,但确实可以确保叠加重新出现。
上述方法也可以在长期运行的前台服务中实施,以确保Android优先考虑您的应用程序,并且不会如此快速地杀死它。