
工控安卓APP开机自启异常重启恢复无人售货柜无人值守基础方案大家好我是黒漂技术佬。今天咱们聊一个无人售货柜最基础、但最容易翻车的话题——开机自启。你可能会说“不就是个开机广播吗有啥难的”兄弟那是手机安卓的玩法。放到工控机上断电重启、系统升级、后台杀进程、内存不足… 随便一个场景都能让你的APP睡死过去而柜子在几百公里外的便利店门口你总不能天天飞过去手动点开吧一、为什么工控安卓的开机自启和手机不一样先给新手朋友掰扯清楚工控安卓和咱们手上的手机安卓看着都是Android骨子里差别大了去了对比维度手机安卓工控安卓售货柜运行模式用户交互为主APP前后台切换7x24小时常驻无人值守重启场景用户手动关机、系统更新断电、跳闸、硬件复位、看门狗重启进程保活系统严格限制后台防止耗电要求APP永不退出退出就是事故权限管理运行时动态申请用户授权需要系统级白名单固化权限核心痛点一句话手机上APP被杀了用户手动点开就行工控设备上APP被杀了这台柜子就失联了直到有人现场处理。二、开机自启的三层防护体系做无人售货柜开机自启不能只靠一层得有兜底方案。我给大家总结了三层防护模型第一层系统开机广播基础层这是最常规的方式监听BOOT_COMPLETED广播。但注意几个坑// AndroidManifest.xml 中注册receiver android:name.BootReceiverandroid:enabledtrueandroid:exportedtrueintent-filter android:priority1000action android:nameandroid.intent.action.BOOT_COMPLETED/category android:nameandroid.intent.category.DEFAULT//intent-filter/receiver踩坑提醒Android 10 以后静态广播接收开机的权限收紧了部分工控ROM需要在系统设置里手动开启自启动权限有些定制ROM改了开机广播动作名比如有的用android.intent.action.QUICKBOOT_POWERON要适配设备首次开机、恢复出厂设置后部分系统要求APP至少被手动打开过一次才能收到开机广播第二层守护进程保活中间层光靠开机广播不够因为运行中被系统杀掉怎么办这时候需要守护进程。方案一双进程守护经典方案主进程运行业务逻辑守护进程独立进程轮询检测主进程是否存活挂了就拉起来// 守护进程核心逻辑伪代码publicclassDaemonServiceextendsService{privateHandlerhandlernewHandler();privateRunnablecheckTasknewRunnable(){Overridepublicvoidrun(){if(!isMainProcessRunning()){IntentintentnewIntent();intent.setClassName(com.vending.machine,MainActivity);intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);startActivity(intent);}handler.postDelayed(this,5000);// 每5秒检测一次}};}方案二系统白名单保活推荐工控机专属跟工控板厂商沟通把你的APP加入系统内存清理白名单加入后系统不会因为内存不足杀掉你的进程这是工控设备最靠谱的保活方式没有之一第三层看门狗硬件复位终极兜底如果软件层面都挂了呢比如APP崩溃、系统卡死、ANR无响应…这时候就需要硬件看门狗了APP定期比如每30秒给看门狗芯片喂狗如果超过时间没喂狗看门狗直接触发硬件整机复位相当于物理重启软件再怎么崩都不怕// 喂狗伪代码具体看硬件厂商提供的接口publicclassWatchDogManager{publicvoidfeedDog(){// 通过串口或系统API写入喂狗信号SerialPortManager.getInstance().sendCommand(FEED_WATCHDOG);}// 定时任务每20秒喂一次publicvoidstartFeeding(){TimertimernewTimer();timer.schedule(newTimerTask(){Overridepublicvoidrun(){feedDog();}},0,20000);}}三、异常重启后的状态恢复光把APP拉起来还不够还得恢复现场。比如柜子正在交易呢断电了重启后怎么办1. 关键状态持久化把核心运行状态实时存到本地// 状态持久化示例publicclassStateManager{publicvoidsaveDoorState(booleanisOpen){SpUtils.putBoolean(door_state,isOpen);}publicvoidsaveLastTransaction(StringorderId){SpUtils.putString(last_order_id,orderId);}// APP启动时检查异常状态publicvoidcheckAbnormalStateOnBoot(){booleandoorWasOpenSpUtils.getBoolean(door_state,false);if(doorWasOpen){// 上次断电时门是开的上报异常执行关门逻辑reportAbnormal(power_off_door_open);DoorManager.forceCloseDoor();}}}2. 启动自检流程APP启动后不能直接进业务先走一遍自检检查网络状态检查硬件连接门锁、摄像头、串口检查上次是否异常退出同步本地缓存数据全部通过后再进入正常运行模式四、量产踩坑经验分享说几个我踩过的坑帮大家避避雷坑1开机广播延迟现象设备开机后5分钟APP才起来原因部分工控ROM开机后先跑系统服务广播优先级低解决跟厂商调开机广播优先级或者用系统启动脚本直接拉起APP坑2SD卡挂载延迟现象APP起来了但读不到配置文件原因开机广播发出时外置存储还没挂载完成解决增加MEDIA_MOUNTED广播监听或者启动后轮询存储状态坑3Android 12 后台启动限制现象从后台/广播启动Activity失败原因高版本安卓限制后台启动前台页面解决申请SYSTEM_ALERT_WINDOW悬浮窗权限或者用全屏Intent方式五、总结无人售货柜的开机自启核心思想就一个多层兜底永不掉线。第一层开机广播保证正常开机能起来第二层进程守护白名单保证运行中不被杀第三层硬件看门狗保证系统卡死也能复位最后加上状态恢复保证起来后业务不混乱做工控设备稳定性永远是第一位的。用户不会关心你用了什么高大上的技术只会关心这柜子会不会突然用不了。我是黒漂技术佬专注无人零售物联网实战干货。下一篇咱们聊《设备开机自动注册逻辑》讲讲批量铺货时怎么让设备自己报到不用人工一台台配置。有售货柜工控开发的问题欢迎私信交流看到必回~