一、一开始是我自己惯出来的
儿子上大班,早上醒了第一件事就是摸遥控器,熟练到闭着眼都能按对。他知道哪个键打开哔哩哔哩,也知道一集看完再往前挪一格就是下一集。
我一开始是答应的。孩子想看动画片,这不算过分的要求,我自己下班回来还抱着手机刷个没完。问题是这件事没有底:说好一集,看完他说再看一集;我说不行,他就开始磨,磨到我烦。等回过神来一个上午已经没了——他一天里最精神、最好说话的那两个小时,交给了电视。
我试过把遥控器藏起来,他会翻;试过拔电源,他会插回去;试过讲道理,他“嗯嗯嗯”点完头,转头接着看;也吼过,他哭一场,我心里难受一整天。
办法试完一圈,我换了个想法:不拦他看,给“看”这件事加一道门。门不是不让他出去,是得自己走过来。

二、这道门长什么样
现在电视上装的这个 app 是我自己写的,包名 com.awen.tvguard。每天冷启动、或者从待机唤醒之后,第一屏不是哔哩哔哩,是它。流程就三步:问几个问题、认今天的字、闯三道题。
开机问答。 三题:今天早饭吃完了吗、刷牙了吗、到上学时间了吗。答“是”才往下走,答“没有”就停在那一题上,按钮锁 60 秒,让他先去把事情做了。他答了什么,我手机上能看见。

认今天的字。 每天一个字,由我这边服务端轮换下发,内置字库 423 个字,按幼儿园大班到一年级的常用顺序排。页面上除了那个大字,还有一笔一笔写出来的笔顺动画、笔画名(“共 2 画:横折钩 撇”)、拼音声调,和一个“听读音”按钮。
闯关。 认完点“我学会啦,去闯关”,三道题:听音选字、看字选拼音、再听音选字(最后一道换一批干扰字,防止他看着眼熟就蒙)。三题过了才放行,放行之后才是 15 分钟。

这里得说句实话。门上的字是“我学会啦,也会写了”,但电视上没有笔,app 验证不了他到底写没写,这一步目前只能靠他自己说。真正的检查靠幼儿园老师,和他妈晚上翻他的写字本。我原本想加一个拿手写板描红的环节,卡在这儿一直没做,说到底还是懒。
三、15 分钟是硬上限
放行之后,单次 15 分钟——差不多就是他看的那部动画片一集的长度;当天累计 30 分钟,用完就得等第二天。
到点了它不是直接黑屏,是把画面停在一张提示页上倒计时 5 分钟。这 5 分钟里我可以在手机上给他放开,或者直接在电视上答一道两位数乘法、再输家长密码。原来我是到点就关机,试了两天发现我自己想看个新闻都得重新开机,索性改成“停在那页上”——对他来说效果一样,反正看不了,对我来说顺手多了。
另外还有两段禁看时间:工作日的白天(上学时间)和每天晚上八点以后。节假日按国务院那份表走,法定假日不算上学日;周末要是调休补课,照样拦。这张表跟我手机 ROM 里用的是同一份。
四、为了让它站稳,我跟这台电视打了几架
这台电视是海信 VIDAA,Android 11。它不让我这种第三方 app 在系统里说话算数,所以下面这几个坑是绕不开的。
开机广播被 ROM 禁用。 应用第一次开机收到 BOOT_COMPLETED,11 秒之后,系统就把我的接收器写进 disabledComponents 了,之后我再也收不到开机广播。解决办法不在代码里:得在电视上“小聚助手 → 启动管理”里把“电视看护”打开,让 ROM 自己把它加进白名单。
后台拉不起界面。 孩子按遥控器上的 HOME 键就能跑掉,我要把他抓回来,得在后台 startActivity——结果日志里只有一行 Abort background activity starts,画面纹丝不动。翻遍资料,唯一被 ROM 认账的豁免是“悬浮窗”权限。麻烦的是这个权限每次开机都会被复位,所以 46 上常驻了一个每 10 秒巡检一次的守护脚本,电视的 adb 一上线就把授权补回来。这也是为什么冷启动的第一屏能不能进看护页,取决于家里那台服务器在不在跑——听起来很傻,但这是我试完所有办法之后剩下的一条。
HOME 键抓不回来,就改成“抢回来”。 HOME 是系统级按键,应用只能吞掉自己界面里的按键,吞不掉遥控器的 HOME。所以后台每 5 秒看一眼前台,不是哔哩哔哩就把它杀掉重新拉起来。这里有个坑:拉起来之后得按住 25 秒不乱动,因为冷启动那十几秒前台还挂在桌面上,急着判断就会变成“刚拉起来又杀掉”的死循环。
唤醒那一刻的断网。 这台电视从待机恢复会先把网卡 reset 一遍,实测要五六秒才恢复,而它在网络恢复后 0.1 秒就照着“上次用的那个应用”去冷启动。如果上次用的是哔哩哔哩,它就会在没网的状态下起来,然后停在“加载失败,按 OK 键重试”。所以我把唤醒启动项换成了看护:看护等网络真正通稳定 3 秒,再去拉哔哩哔哩。
遥控器没有数字键。 家长解锁要先答数学题再输密码,我以为输密码这种事在屏幕上有个数字键盘就行了,结果实测这些按键根本发不出来,只能用屏幕上的软键盘。答完题想提交,焦点必须停在“确定”上——焦点还在数字上就按确定,是往输入框里填一个数字。这个 bug 拖了两天才修,因为我在自己电脑上模拟的时候一直是好的。
架构不复杂:电视上是一个 Android 应用(不引 Gradle,aapt2 + javac + d8 + zipalign + apksigner 一条 build.sh 出包),家里 46 上跑一个 Go 写的小服务存配置和字库、给电视每分钟拉一次,我在手机上打开管理页改单次额度、每日额度、今天的字;再外加一个纯服务端的兜底脚本,万一 app 被卸了、进程被杀了,也能按同样的口径把电视待机。
五、用了一个月,说点实话
这套东西 9 月中旬装上去的,到现在快一个月。
好的地方:他早上起来还是想看电视,但会先看一眼今天要认的字;看得少了,从“一上午”变成“两块 15 分钟”;我不用每天早上当恶人了——规矩由机器执行,我只负责修机器。有一天他在饭桌上跟我说“爸爸,今天那个字是 XXX”,我假装很淡定,其实心里挺高兴。
不好的地方,或者说我不太确定的地方:
他会为了看电视认真做题。这本质上还是“用奖励换行为”,跟小红花、跟 KPI 是同一套——我在上一篇《为何家会伤人》的读书笔记里刚批评过这套(链接),转头自己用上了。我承认这是矛盾的。
我的辩解是:我不指望他靠这个 app 爱上学习,我只想干两件事。一是让“看电视”这件事变成需要自己动手去换的东西,不是醒了就有;二是把“起床 → 开哔哩哔哩”这条自动播放的链条打断,中间插进去一个要动脑子的动作。至于认字本身,一天一个,一年三百多个,总比什么都不做强。
还有一个问题我到现在也没有答案:等他大一点,会不会因为“认字是看电视的门槛”而讨厌认字。真到那时候,这条路就得再改。
六、最后
现在家里最讲规矩的东西是那台电视。它每天问孩子三个问题、发一个字、考三道题,比我有耐心——它不会因为赶时间就随便放行,也不会因为他哭就心软。
这东西我不打算做成通用的给人用,它就是个给自家孩子做的偏心装置。哪天他觉得烦了,开始跟我讨价还价,我再改。反正改它比改我自己容易。
明天的字是什么我还没看,手机上那个后台能看到。
评论
0 条评论