安卓 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%的工控场景需求。
