一,项目背景
专门给小孩做一个玩手机的模式或者环境,可以看视频,听音乐,电话防乱接,使用时间管控等
二,功能模块
2.1 家长中心
家长中心主要负责:电话监控/时间监控/护眼模式/密码/网络等相关功能
2.1.1 来电监听
使用TelephonyManager相关接口监听电话的状态,然后根据来电状态显示拦截或提示动画。
TelephonyManager.listen(mPhoneStateListener, PhoneStateListener.LISTEN_CALL_STATE);
//通话中
case TelephonyManager.CALL_STATE_OFFHOOK:
//响铃
case TelephonyManager.CALL_STATE_RINGING:
//挂断
case TelephonyManager.CALL_STATE_IDLE:
拦截activity:当来电时,会弹出验证页面让家长验证密码后,再接听电话。
弹出时机:来电页面到前台后,即对用户可见的时候,弹出拦截activity.(之前尝试在监听到响铃的时候弹出(TelephonyManager.CALL_STATE_RINGING),但是这种情况下会出现拦截activity过早启动,导致拦截activity出现在来电页面下面)。目前从系统中找到了监听activity处于前后台的接口。可以监听到某个包下的activity前后台的变化。这个接口是从系统层面hook出来的接口。使用接口的过程中也发现了拦截activity弹出过早的情况。所以监听到InCallActivity到前台后,延迟200ms启动拦截activity。
2.1.2 时间管控
限制孩子使用手机时长
计时逻辑:如何计时,刚开始考虑了Handler/CountDownTimer/Timer/AlarmManager等计时机制。最后使用AlarmManager
来作为计时器,把计时交给系统。其它计时器也可以实现,使用AlarmManager会比较简单。
当前具体实现逻辑是:把时间节点和该节点所做的事前对应起来,使用默认排序的TreeMap<Long, Integer> timeFences = new TreeMap<Long, Integer>();将时间节点和对应事物存储起来。然后启动倒计时。当时间围栏到来时,做相关动作/
拦截activity:当使用时间到来后,会弹出验证页面让家长验证密码后,再使用。
2.2 音乐
负责音乐播放,使用的是android原生的MediaPlayer/MediaSession框架
2.3 视频
采用的是跟XX视频合作的模式
三,技术栈
1.网络访问
采用的retrofit2+Okhttp3
几个关键的技术点:
1.如何使用缓存提高加载速度,减少服务器负荷,没有网络的情况下读取缓存数据
2.Okhttp拦截器Interceptor
参考文章:
Cache:
https://blog.youkuaiyun.com/qqyanjiang/article/details/51316116
https://cnbin.github.io/blog/2016/02/20/http-qing-qiu-,-xiang-ying-,-huan-cun/
retrofit2源码解析:
https://www.jianshu.com/p/0c055ad46b6c
2.图片处理
3.音乐
4.视频
5.XX空间的创建/切换/删除
四,其他