之前我们完善了“高级工具”模块中第四个功能——程序锁的布局和功能实现,这一节中我们将完善更多细节,包括条目在操作时的初始化动画事件监听和点击锁集合后数据库修改等操作。
该功能需要解决以下问题:
- 任务栈的切换,需要设置为单例;
- 过滤已经解锁的应用,需要发送广播传递信息;
- 开启服务后,再去添加加锁应用,不能生效,需要使用内容观察者观察数据库变化,一旦数据库变化,则放置包名的集合需要重新获取数据;
- 挂起输入密码界面的时候,不需要去显示手机卫士的图标;
- 回退按钮的处理,在输入密码的界面中按下Back键需要返回到桌面。
修改AppLockActivity,完善相应逻辑,代码如下:
锁定的应用在被打开时需要输入指定密码,如图中红框所示:
为了让程序锁在应用退出时依旧生效,需要将该功能维护到组件中,应按照以下步骤实现:
- 判断当前开启的应用(现在手机所处的任务栈);
- 如果开启的应用在已加锁的列表中,就需要弹出拦截界面;
- 看门狗服务,需要一直(死循环)对开启的应用做监听;
首先修改activity_setting.xml,添加自定义条目,作为是否开启程序锁设置项的布局,代码如下:
接着,修改SettingActivity,添加initAppLock(),作为初始化程序锁的方法,代码如下:
在service包下新增WatchDogService,作为负责程序锁的服务,需要去创建一个广播接受者过滤掉已经通过程序锁的应用,否则会一直循环,代码如下:
在activity包下新建名为EnterPsdActivity的Activity,作为程序锁功能中拦截Activity使用的活动,首先修改其布局文件activity_enter_psd.xml,代码如下:
修改EnterPsdActivity,完善锁定应用时的跳转逻辑,由于涉及到任务栈之间的切换,需要在清单文件中设定EnterPsdActivity的启动模式为单例模式(),代码如下:
由于涉及到获取任务栈的操作,需要在清单文件中声明对应权限,代码如下:
修改AppLockDao,在插入数据insert()和删除数据delete操作中添加内容解析器,以此让看门狗服务进行判断是否需要重新获取数据,代码如下:
修改WatchDogService,通过内容解析者去获取信息,判断存储应用信息的数据库是否发生变动,代码如下:
为了在弹出输入程序锁密码界面时,按下HOME键后不会显示手机卫士的Activity,需要在清单文件中对EnterPsdActivity的特殊属性进行声明,让其不去显示手机卫士的图标,代码如下:
为了在弹出输入程序锁密码界面时,按下Back键后不会退出该界面而直接进入该应用,则需要重写按下Back键的点击事件,修改EnterPsdActivity,重写方法,代码如下:
前面我们完成了“高级工具”模块的实现,接下来需要去实现“手机杀毒”的模块功能,进入该模块后,会出现扫描应用的界面,如图所示:
当应用扫描完毕后,会弹出疑似病毒应用的卸载窗口,如图所示:
扫描列表可以使用布局来实现,由于每次扫描都会添加扫描的应用信息,即添加一项,为了不让在显示时相互遮挡,在每一次添加时都给它设定为最开始的坐标;另外,由于应用比较多,考虑到扫描应用时可能显示不全,还需要使用来实现竖直方向的拖拽,如图所示:
修改HomeActivity,修改initData(),添加跳转到“手机杀毒”模块的界面逻辑,代码如下:
在activity包下新建AnitVirusActivity,作为“手机杀毒”模块的页面,首先修改其布局文件activity_anit_virus.xml,按照之前的思路进行完善,代码如下:
注意,由于进度条使用自定义样式,为了维护其样式需要填充三张图片,在res/drawable下新建一个名为progress_bg.xml的文件,代码如下:
上一小节中,我们完成了“手机杀毒”模块的布局实现,现在需要完善病毒数据库的查询过程。判断一个应用是否为病毒,只需要从数据库从提取信息并进行字段(MD5码)比对即可确认。
修改SplashActivity,修改initDB()方法,在其中使用initAddressDB()方法,准备病毒数据库的信息录入,以此为查询过程做准备,代码如下:
在dao下新建VirusDao,作为操作数据库中数据表里数据的工具类,增加常用方法,代码如下:
在进行数据操作前,我们先来完善该模块下界面的一些动画逻辑 。
修改AnitVirusActivity,完善旋转动画的逻辑,代码如下:
修改AnitVirusActivity,添加checkVirus(),用于遍历所有应用然后判断应用是否为病毒,代码如下:
在domain包下新建ScanInfo,作为记录扫描信息的实体类,代码如下: