我找到了符合我想要的代码,例如:
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
但这似乎要求参与活动,而不是服务。
基本上我想要做的是接收ON_BOOT_COMPLETED意图并启动服务,让服务定期检查屏幕方向是否已经改变(或最好通知屏幕方向),并将其设置回横向。
有没有办法在服务中执行此操作?我一整天都在寻找答案而一直找不到任何答案,所以如果这是一个重复的问题,我会大声道歉。
注意:这是一个付费自由职业者项目,仅用于支付我工作的人所拥有的设备。它不适用于恶意软件或任何其他此类目的
答案 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
是一个简单的开关,可以显示覆盖窗口以进行测试。 (你应该看到一个半透明的红色覆盖层。)