安卓 Manifest 清单工控专用配置:全屏、禁止锁屏、开机自启、屏幕常亮

📅 2026/7/26 23:45:47 👁️ 阅读次数 📝 编程学习
安卓 Manifest 清单工控专用配置:全屏、禁止锁屏、开机自启、屏幕常亮

安卓 Manifest 清单工控专用配置:全屏、禁止锁屏、开机自启、屏幕常亮

工控设备上跑安卓APP,Manifest配置不对,你的界面可能半路弹个状态栏、设备锁屏黑了屏、重启后APP没起来——现场运维直接骂娘。

一、AndroidManifest.xml——工控APP的"身份证+配置表"

每个安卓应用都有一个AndroidManifest.xml,它声明了APP的包名、组件、权限、硬件需求等关键信息。在手机上,Manifest配置随便一点问题不大;但在工控设备上,每一行配置都可能直接决定设备能不能正常运转

工控场景下的核心诉求:

  • 全屏显示:不要状态栏、不要标题栏,屏幕就是界面
  • 永不锁屏:设备常驻运行,不能因为锁屏中断监控
  • 开机自启:断电恢复后APP自动启动,无需人工干预
  • 屏幕方向锁定:工业屏固定安装方向,不能随意翻转

这些全部需要在Manifest中提前声明和配置。

二、全屏显示配置

2.1 去掉标题栏

<application><activity>标签中设置主题:

<activityandroid:name=".MainActivity"android:theme="@android:style/Theme.NoTitleBar.Fullscreen"></activity>

或者在代码中动态设置(更灵活):

requestWindowFeature(Window.FEATURE_NO_TITLE);

2.2 去掉状态栏——真正的沉浸式全屏

getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,WindowManager.LayoutParams.FLAG_FULLSCREEN);

Android 4.4+ 推荐使用沉浸式模式(Immersive Mode),状态栏和导航栏完全隐藏,且用户滑动边缘也不会弹出:

getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY|View.SYSTEM_UI_FLAG_FULLSCREEN|View.SYSTEM_UI_FLAG_HIDE_NAVIGATION|View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN|View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION|View.SYSTEM_UI_FLAG_LAYOUT_STABLE);

工控陷阱:沉浸式模式下,用户边缘滑动会短暂恢复系统栏。用IMMERSIVE_STICKY而不是IMMERSIVE,前者几秒后自动重新隐藏,后者需要代码手动恢复。

三、禁止锁屏与屏幕常亮

3.1 声明权限

<uses-permissionandroid:name="android.permission.WAKE_LOCK"/>

3.2 代码设置屏幕常亮

方式一:WindowManager Flag(最常用)

getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);

方式二:布局XML属性(更简洁)

<RelativeLayoutandroid:keepScreenOn="true"><!-- 你的布局内容 --></RelativeLayout>

方式三:PowerManager WakeLock(需要WAKE_LOCK权限,更底层)

PowerManagerpm=(PowerManager)getSystemService(Context.POWER_SERVICE);PowerManager.WakeLockwl=pm.newWakeLock(PowerManager.SCREEN_BRIGHT_WAKE_LOCK,"MyApp:ScreenOn");wl.acquire();// 在合适的时候释放:wl.release();

工控建议:优先使用FLAG_KEEP_SCREEN_ON,不需要WAKE_LOCK权限,系统会在Activity销毁时自动释放,不会导致屏幕意外常亮耗电。WakeLock方式适合Service场景。

四、开机自启配置

4.1 声明权限

<uses-permissionandroid:name="android.permission.RECEIVE_BOOT_COMPLETED"/>

4.2 注册BroadcastReceiver

<receiverandroid:name=".BootReceiver"android:enabled="true"android:exported="true"><intent-filter><actionandroid:name="android.intent.action.BOOT_COMPLETED"/><categoryandroid:name="android.intent.category.DEFAULT"/></intent-filter></receiver>

4.3 BootReceiver实现

publicclassBootReceiverextendsBroadcastReceiver{@OverridepublicvoidonReceive(Contextcontext,Intentintent){if(Intent.ACTION_BOOT_COMPLETED.equals(intent.getAction())){IntentlaunchIntent=newIntent(context,MainActivity.class);launchIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);context.startActivity(launchIntent);}}}

工控陷阱一:Android 3.1+,安装后首次启动的APP不会收到BOOT_COMPLETED广播,必须用户手动启动一次。工控设备出厂时需预装并手动激活一次APP。

工控陷阱二:部分定制ROM在FastBoot(快速开机)模式下不发送BOOT_COMPLETED,改用LOCKED_BOOT_COMPLETED兜底。

五、屏幕方向锁定

工业屏安装在固定位置,横屏或竖屏不会切换:

<activityandroid:name=".MainActivity"android:screenOrientation="landscape"><!-- 横屏固定,竖屏用 "portrait" --></activity>
属性值说明工控推荐
landscape强制横屏✅ 横屏工业屏
portrait强制竖屏✅ 竖屏工业屏
sensorLandscape根据传感器横屏(可翻转)❌ 工控不推荐
unspecified系统自动决定❌ 工控绝对不要
locked锁定当前方向(API 18+)✅ 通用锁定

六、系统级配置

6.1 sharedUserId——运行在系统进程空间

<manifestxmlns:android="http://schemas.android.com/apk/res/android"package="com.example.industrial"android:sharedUserId="android.uid.system">

声明android.uid.system后,APP获得系统级权限,可以:

  • 写入系统设置Settings.System
  • 关闭其他APP
  • 操作硬件节点/dev/下的设备

前提:必须用平台密钥(platform.pk8 + platform.x509.pem)签名,否则安装失败。

6.2 安装到system分区声明

<applicationandroid:installLocation="internalOnly"...>

工控APP只能装在内部存储,不能装SD卡——SD卡可能被意外拔出。

七、完整Manifest配置示例

<?xml version="1.0" encoding="utf-8"?><manifestxmlns:android="http://schemas.android.com/apk/res/android"package="com.example.industrial"android:sharedUserId="android.uid.system"><!-- 工控核心权限 --><uses-permissionandroid:name="android.permission.WAKE_LOCK"/><uses-permissionandroid:name="android.permission.RECEIVE_BOOT_COMPLETED"/><uses-permissionandroid:name="android.permission.WRITE_SETTINGS"/><uses-permissionandroid:name="android.permission.SYSTEM_ALERT_WINDOW"/><applicationandroid:allowBackup="false"android:icon="@mipmap/ic_launcher"android:label="@string/app_name"android:installLocation="internalOnly"android:theme="@android:style/Theme.NoTitleBar.Fullscreen"><!-- 主界面:全屏 + 横屏锁定 --><activityandroid:name=".MainActivity"android:screenOrientation="landscape"android:configChanges="orientation|screenSize|keyboardHidden"android:exported="true"><intent-filter><actionandroid:name="android.intent.action.MAIN"/><categoryandroid:name="android.intent.category.LAUNCHER"/></intent-filter></activity><!-- 开机自启接收器 --><receiverandroid:name=".BootReceiver"android:enabled="true"android:exported="true"><intent-filter><actionandroid:name="android.intent.action.BOOT_COMPLETED"/><actionandroid:name="android.intent.action.LOCKED_BOOT_COMPLETED"/></intent-filter></receiver><!-- 后台常驻服务 --><serviceandroid:name=".MonitorService"android:enabled="true"android:exported="false"/></application></manifest>

八、常见配置陷阱速查

陷阱现象解决方案
首次安装不收BOOT广播开机不自启出厂前手动激活一次
FLAG_FULLSCREEN被系统主题覆盖状态栏闪现Manifest中同时设置NoTitleBar.Fullscreen主题
WakeLock未释放设备永远不熄屏用FLAG_KEEP_SCREEN_ON替代,或确保release
configChanges未声明屏幕旋转重建Activity加 `orientation
sharedUserId签名不匹配安装失败ERROR_INSTALL_FAILED_SHARED_USER_INCOMPATIBLE必须用同一平台密钥签名
快速开机无BOOT广播冷启动不自启同时监听LOCKED_BOOT_COMPLETED

Manifest配置是工控APP的地基,写对了省心,写错了现场翻车。把上面这份模板拿去改,基本覆盖了80%的工控场景需求。