工控常用系统功能:屏幕亮度控制、休眠关闭、看门狗对接、硬件按键屏蔽
工控安卓和手机安卓最大的区别:一个求着你玩,一个求你别碰。屏幕不能灭、按键不能按、狗不能饿死——今天咱就把这些"反人类"需求一次讲透。
一、屏幕亮度控制
工控设备通常 7x24 无人值守,亮度控制不是为了让用户舒服,而是为了省电 + 延长屏幕寿命 + 夜间降亮避免光污染。
1.1 全局亮度调节
通过Settings.System修改系统亮度,需要WRITE_SETTINGS权限:
// 检查是否授权if(!Settings.System.canWrite(context)){Intentintent=newIntent(Settings.ACTION_MANAGE_WRITE_SETTINGS);intent.setData(Uri.parse("package:"+context.getPackageName()));startActivity(intent);}// 设置亮度 (0~255)Settings.System.putInt(getContentResolver(),Settings.System.SCREEN_BRIGHTNESS,128// 半亮);1.2 仅当前 Activity 亮度
不需要权限,适合局部场景(比如扫码页面拉满亮度):
WindowManager.LayoutParamslp=getWindow().getAttributes();lp.screenBrightness=1.0f;// 0.0~1.0,-1 恢复系统默认getWindow().setAttributes(lp);注意:getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON)也能防止屏幕灭,但它并不能调节亮度,只保持亮着。
二、休眠关闭方案
工控场景"不熄屏"是刚需,三种方案各有擅场:
2.1 FLAG_KEEP_SCREEN_ON(最简)
// Activity 中getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);// 或布局中android:keepScreenOn="true"缺点:仅当前窗口生效,切到后台就失效。
2.2 修改系统休眠时间
// 设为永不休眠(注意会修改全局设置)Settings.System.putInt(getContentResolver(),Settings.System.SCREEN_OFF_TIMEOUT,Integer.MAX_VALUE);需要WRITE_SETTINGS权限。不建议设为永久——万一面板烧屏得不偿失。
2.3 PowerManager WakeLock(持有唤醒锁)
PowerManagerpm=(PowerManager)getSystemService(POWER_SERVICE);PowerManager.WakeLockwl=pm.newWakeLock(PowerManager.SCREEN_BRIGHT_WAKE_LOCK|PowerManager.ACQUIRE_CAUSES_WAKEUP,"MyApp::WakeLockTag");wl.acquire(10*60*1000L);// 10分钟自动释放// 别忘了释放wl.release();需要WAKE_LOCK权限。ACQUIRE_CAUSES_WAKEUP 能在锁屏状态下点亮屏幕。
三、看门狗对接
硬件看门狗是工控设备的"心跳检测器"——App 需要定时往 /dev/watchdog 写数据,超时未写则设备自动重启。
3.1 喂狗原理
publicclassWatchDogFeeder{privatestaticfinalStringWDT_DEVICE="/dev/watchdog";privateScheduledExecutorServiceexecutor;publicvoidstartFeed(){executor=Executors.newSingleThreadScheduledExecutor();executor.scheduleAtFixedRate(()->{try(FileOutputStreamfos=newFileOutputStream(WDT_DEVICE)){fos.write("1".getBytes());fos.flush();}catch(IOExceptione){// 喂狗失败,设备即将重启,快速保存关键数据emergencySaveData();}},0,3,TimeUnit.SECONDS);// 每 3 秒喂一次}}核心要点:
- 喂狗间隔 < 看门狗超时时间(一般设为超时时间的 1/2)
- 用独立线程,不能跟采集逻辑挤同一个线程
- 喂狗失败意味着设备要重启,必须做最后的应急处理
3.2 软看门狗——没硬件时的替代
// 监控主线程是否卡死newHandler(Looper.getMainLooper()).postDelayed(()->{// 超时未收到心跳 => ANR,主动重启 Appandroid.os.Process.killProcess(android.os.Process.myPid());},5000);四、硬件按键屏蔽
工控设备的物理按键不能被用户乱按——音量增减重启导航,后果不堪设想。
4.1 Activity 级拦截
@OverridepublicbooleanonKeyDown(intkeyCode,KeyEventevent){switch(keyCode){caseKeyEvent.KEYCODE_VOLUME_UP:caseKeyEvent.KEYCODE_VOLUME_DOWN:caseKeyEvent.KEYCODE_BACK:// 返回键caseKeyEvent.KEYCODE_HOME:// Home键(仅部分系统有效)returntrue;// 吃掉事件,不传递}returnsuper.onKeyDown(keyCode,event);}局限性:Home 键、Recent 键在大多数系统中 Activity 层级无法拦截,需要系统签名或 framework 修改。
4.2 系统级屏蔽(frameworks/base)
<!-- frameworks/base/core/res/res/values/config.xml --><!-- 禁用导航栏 --><boolname="config_showNavigationBar">false</bool><!-- 禁用状态栏下拉 --><boolname="config_enableStatusBar">false</bool>或者在framework-res.apk中修改,需要 root 或系统签名。
4.3 沉浸模式(全屏+无状态栏)
// API 19+ViewdecorView=getWindow().getDecorView();intuiOptions=View.SYSTEM_UI_FLAG_HIDE_NAVIGATION|View.SYSTEM_UI_FLAG_FULLSCREEN|View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY;decorView.setSystemUiVisibility(uiOptions);能隐藏导航栏,但物理 Home 键还是拦不住。终极方案是改系统源码去掉导航栏。
五、其他工控常用功能速查
// 设置系统时间(需要系统签名或 root)SystemClock.setCurrentTimeMillis(newTimeMillis);// 静音控制AudioManageram=(AudioManager)getSystemService(AUDIO_SERVICE);am.setStreamVolume(AudioManager.STREAM_MUSIC,0,0);// WiFi 开关(API 29+ 已废弃直接开关,需要引导用户)WifiManagerwm=(WifiManager)getApplicationContext().getSystemService(WIFI_SERVICE);// API 29 以下wm.setWifiEnabled(true);// API 29+ 建议用设置面板startActivity(newIntent(Settings.Panel.ACTION_WIFI));六、综合实战代码
publicclassIndustrialActivityextendsAppCompatActivity{privatePowerManager.WakeLockwakeLock;@OverrideprotectedvoidonCreate(BundlesavedInstanceState){super.onCreate(savedInstanceState);setContentView(R.layout.activity_industrial);// 1. 屏幕常亮 + 全屏getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);hideSystemUI();// 2. 设置亮度WindowManager.LayoutParamslp=getWindow().getAttributes();lp.screenBrightness=0.8f;getWindow().setAttributes(lp);// 3. 启动喂狗startWatchDog();}privatevoidhideSystemUI(){ViewdecorView=getWindow().getDecorView();decorView.setSystemUiVisibility(View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY|View.SYSTEM_UI_FLAG_HIDE_NAVIGATION|View.SYSTEM_UI_FLAG_FULLSCREEN);}@OverridepublicbooleanonKeyDown(intkeyCode,KeyEventevent){// 屏蔽音量键和返回键if(keyCode==KeyEvent.KEYCODE_VOLUME_UP||keyCode==KeyEvent.KEYCODE_VOLUME_DOWN||keyCode==KeyEvent.KEYCODE_BACK){returntrue;}returnsuper.onKeyDown(keyCode,event);}@OverrideprotectedvoidonDestroy(){super.onDestroy();if(wakeLock!=null&&wakeLock.isHeld()){wakeLock.release();}stopWatchDog();}}七、权限配置清单
<uses-permissionandroid:name="android.permission.WAKE_LOCK"/><uses-permissionandroid:name="android.permission.WRITE_SETTINGS"/><uses-permissionandroid:name="android.permission.DEVICE_POWER"/><uses-permissionandroid:name="android.permission.CHANGE_WIFI_STATE"/>工控系统的"奇技淫巧"归根结底就是一句话:把 Android 变成一台专用的嵌入式设备。该关的关掉,该锁的锁死,剩下的交给看门狗。