透明视图叠加层“落后”窗口管理器?

时间:2013-11-26 02:13:50

标签: android screen-orientation window-managers

以下工作代码在接收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

1 个答案:

答案 0 :(得分:1)

可能会发生的事情是,由于您的View附加在BroadcastReceiver中,因此应用程序本身会在其余时间“停止”,当Android决定需要内存时,请直接停止。这实际上可能不是原因,因为您确实有一个View总是显示,但由于它不是Activity的一部分,系统可能会以不同的方式处理它。

说到这就是我要做的事情:

对您首选的View类进行子类化并覆盖onDetachedFromWindow(),以便在调用方法时进行日志/打印。如果在调用此奇数叠加消失时onDetachedFromWindow()被调用,则确定将视图重新添加到WindowManager的方法。您可以发送广播以由BroadcastReceiver拾取,或创建类似Listener的接口来分派已分离的事件。然后,界面将由应用程序的长期运行部分(服务)实现。

当覆盖图消失时,您还可以看到OrientationEvenListener是否有任何有趣的事情。

如果所有其他方法都失败了,您可以定期重新添加View。不是最佳解决方案,但确实可以确保叠加重新出现。

上述方法也可以在长期运行的前台服务中实施,以确保Android优先考虑您的应用程序,并且不会如此快速地杀死它。