在服务中将方向设置为横向模式

时间:2013-11-24 20:10:04

标签: android screen-orientation

我找到了符合我想要的代码,例如:

setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE); 

但这似乎要求参与活动,而不是服务。

基本上我想要做的是接收ON_BOOT_COMPLETED意图并启动服务,让服务定期检查屏幕方向是否已经改变(或最好通知屏幕方向),并将其设置回横向。

有没有办法在服务中执行此操作?我一整天都在寻找答案而一直找不到任何答案,所以如果这是一个重复的问题,我会大声道歉。

注意:这是一个付费自由职业者项目,仅用于支付我工作的人所拥有的设备。它不适用于恶意软件或任何其他此类目的

1 个答案:

答案 0 :(得分:5)

首先,强制性的"请不要这样做"。我希望你有充分的理由这样做,因为用户通过禁用屏幕旋转设置此首选项是合法的方式。

那就是说,你不能从服务中做到这一点。正如您所指出的,Activity.setRequestedOrientation(int)属于Activity类,不能在任何其他上下文中使用。

您可能会考虑做的是创建一个透明的系统覆盖窗口,并强制执行它的横向方向。

要回答您的后续问题,请参阅以下代码片段:

private static final boolean DISPLAY = false;

@Override
public void onCreate() {
    final View view = new View(this);
    int dimension = 0;
    int pixelFormat = PixelFormat.TRANSLUCENT;
    if (DISPLAY) {
        view.setBackgroundColor(Color.argb(128, 255, 0, 0));
        dimension = LayoutParams.MATCH_PARENT;
        pixelFormat = PixelFormat.RGBA_8888;
    }
    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) getSystemService(WINDOW_SERVICE);
    wm.addView(view, params);
}

在摘录中,DISPLAY是一个简单的开关,可以显示覆盖窗口以进行测试。 (你应该看到一个半透明的红色覆盖层。)