在广播接收器中工作的代码在Activity中不起作用

时间:2013-11-27 22:48:06

标签: java android screen-orientation

以下代码在BroadcastReceiver中运行,并向系统级窗口管理器添加透明覆盖,以使方向保持在横向模式。这段代码工作正常。

但是,当我将此代码放在Activity中时,为了让Activity添加叠加层,没有任何反应。对于我的生活,我无法弄清楚为什么。我在一个从OnClickListener调用的方法中有它。我知道该方法被调用,因为我放在方法顶部的Toast消息。

        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);

这段代码不能让它在活动中运行有什么问题?

在活动中,context的每个实例都替换为this。这可能是问题吗?

1 个答案:

答案 0 :(得分:1)

问题很可能在你的上下文中。

事实证明,广播接收器中onReceive方法中的上下文与活动不同context。它会膨胀UI元素,但是通胀将使用您运行的系统的默认主题完成,而不是在应用程序中定义的内容。 (如果这成为一个问题,你必须要注意这一点。)

另一方面,当你在onClickListener中时,这是onClickListener匿名还是硬引用?

例如:你在做什么

yourButton.setOnClickListener( new View.OnClickListener() { //code }; );