手机卫士11_ 自定义控件_缓存清理_病毒库更新

Posted 抓根宝

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了手机卫士11_ 自定义控件_缓存清理_病毒库更新相关的知识,希望对你有一定的参考价值。

拷贝安卓源码中的逻辑,可以考虑先创建一个小项目实现以下效果

1,病毒数据库的自动更新(连接网络,然后获取特征码保存到数据库?)

①工程师发现病毒apk,获取到它的特征码发布到服务器上

通过 MD5 或者ASH1获取特征码

②客户端杀毒软件下载特征码(可能是 JSON)到本地客户端

(在打开软件的时候还是打开查杀界面的时候?其实都不适合,应该开启一个服务去定期更新数据库,访问病毒更新特征码地址)

定期更新,timertimertask,一般一个小时更新一次(测试的时候写短一点)

连接服务器:Url对象,获取链接HttpUrlConnection,设置超时时间,请求方式,

获取响应码,判断结果,最后转换输入流为字符串.转换成json对象

③本地客户端解析特征码,然后保存至数据库,最后查杀病毒.

解析服务器的病毒库版本,获取本地病毒库的版本(对应的表).

如果不一致,就添加新的病毒条目到本地,并且更新版本.

额外:①添加条目的时候记得查看DDL数据模式定义,语言查看表结构

②如果要更新数据库条目和版本,记得开启数据库事务,保持一致性.

db.beginTransaction();//开始数据库事务

db.beginTransactionSuccessful();//事务执行成功

db.endTransaction()//结束事务,写在 finally.

③要记得开启服务,放在splash里开启即可.(要判断病毒数据库是否存在)

 

额外:检测恶意APP还有:文件检验,行为分析等,很多查杀病毒方式.

 

2,横竖屏切换的生命周期

2.1横竖屏切换的时候界面重新创建activity,解决方式:

①固定横竖屏.

②不让activity重建.

 

2.2 自定义控件的显示样式:

查找源码>>styles样式文件,找到想要查看的显示样式

根据不同的样式节点,查看对应的xml样式文件.

进度条实际上有三层,一个背景,两个进度(大进度,小进度,参考播放器进度)

//不想写就拷贝源码中的文件,修改参数即可,把进度背景改成想显示的图片(要替换的话,三个背景图片最好都替换掉)即可.

要注意对应的属性名,不要搞错了,不然不生效。

参考背景设置xml资源

<?xml version="1.0" encoding="utf-8"?>

<layer-list xmlns:android="http://schemas.android.com/apk/res/android">   

<item  android:id="@android:id/background" android:drawable="@drawable/progress_bg">

    </item>

<itemandroid:id="@android:id/secondaryProgress"android:drawable="@drawable/security_progress"> </item>

 <itemandroid:id="@android:id/progress"  android:drawable="@drawable/security_progress">

    </item>  

</layer-list>

 

3, 缓存清理功能

3.1 ui

①缓存清理,SD卡清理,痕迹清理(暂时不用)三个选项卡,使用Fragment碎片界面.

②主界面ui参考:

记得给这让两个小选项卡的背景变换(表示一个被选中,一个没选中.参考home界面的条目小背景,一个透明的边框线)

点击一个选项卡之后,还要记得切换它们的图标资源(醒目的和不醒目的图片,文本颜色也可以修改掉,更好看一些,?)记得改布局的默认颜色,不然第一次打开颜色还是黑色.

Fragment,存放所有碎片文件(考虑向下兼容,使用v4)

创建类继承Fragment,重写onCreate,返回的View 代表这个碎片布局样式.

布局样式:暂无,写一个TextView的文本标记一下即可.

获取上下文:getActivity();

Activity

点击事件:创建Fragment 继承类对象.

获取支持FragementManager.beginxXX再获取事务.

然后ft.replace(id,对象);最后ft.commit();

额外:一开始指定一个帧布局,在打开功能页面的时候就能显示它.

 

3.2 清理缓存的功能

什么是缓存:临时文件的的存储,当系统资源不足的时候 会回收缓存空间

①在缓存的Fragment里,扫描所有应用程序的缓存目录,如何实现?

查找源码(看看安卓自己是怎么做的):

在设置界面的应用程序可以看到每个应用程序的缓存内容,通过这一点去找到系统源码的setting源码,

如果直接把setting源码导入工程,会报错,因为它是在框架下进行编译的,依赖框架里的api,而工程里缺少很多系统底层开发的api,所以会报错。

查询源码:查找特定字符,根据特定字符去查找源码,ctrl+H搜索

一致追寻到获取缓存信息的代码.packageStats api

 

②代码获取缓存数据

PackagerManage pm

pm.getPackageSizeInfo();获取包大小信息,但是这个方法被隐藏了.

通过反射获取到这个方法//获取字节码对象,获取到所有方法

//其它自己探索

额外:注意权限问题

 

3.3 Fragment ui布局:(可以用ListView 也可以直接用LinearLayout填充空白数据)

 

②在Fragment onStart()方法编写获取所有应用程序的缓存

//获取所有包信息,根据包名,利用反射获取缓存信息.

③记得更新界面ui,扫描进度,扫描的文本,

判断是否存在缓存,存在缓存就把有缓存的消息(有缓存的AppLiaction和缓存大小,可以考虑创建一个对象去封装这些信息)发给主线程

要让条目点击发生状态改变,设置背景资源状态选择器

显示缓存的ui优化:参考ui.

 

 

4清除某一个程序的缓存信息

4.1

查看系统源码setting中清楚缓存的按钮点击事件中的代码逻辑

pm.deleteAppliCationCacheFile()//也是被隐藏的,通过反射去调用它

额外:注意权限异常。但是这个权限只能给系统app使用,所以这个逻辑无法实现

解决方式:曲线救国,用户如果点击了单个应用的清除缓存,就跳过setting的详细页面,让用户自己去实现这个清除功能。

 

4.2 BUG 如果到别的页面再返回清理缓存界面,旧数据和新数据都显示在页面上。

onStart()//界面可见的时候,添加一条逻辑,每次可见就清空一次布局中的子控件

ll.reamoveAllViews();

 

5,清除全部缓存:安卓系统的漏洞:让系统发送广播,硬盘空间不够用,系统回收缓存。

实现方法:发送一个消息给操作系统,我要申请一个非常大的空间。就会回收缓存了。

实现步骤①:增加一个新按钮

②找到这个控件,点击的时候申请一个非常大的空间

PackageManager>>freeStorageAndNotify(申请空间,观察者接口);

//申请一个可用空间,观察者返回的是最大可申请空间(能返回多少返回多少)

这是一个隐藏的api

申请的空间,integer.MaxValue//2G,231次方 为2G

权限:CLEAR_APP_CACHE//安卓的漏洞,谷歌没有检查这个权限的使用app(system).

 

额外:清楚完缓存之后,清楚掉下面所有的子控件,从而更新界面显示。

 

6.SD卡清理:

扫描SD卡中的文件(递归遍历SD卡文件夹,筛选常见缓存文件拓展名.tmp.temp

把遍历出来的缓存文件显示在界面上,用户可以手动清空所有文件(删除掉).

额外:市面上的清理SD卡还会根据一个数据库(储存市面上常见APP的缓存目录)来判断这个缓存文件属于哪一个APP来提示用户,提高用户体验

 

 

 

以上是关于手机卫士11_ 自定义控件_缓存清理_病毒库更新的主要内容,如果未能解决你的问题,请参考以下文章

[android] 手机卫士自定义组合控件

[android] 手机卫士自定义滚动控件

Android 手机卫士--自定义组合控件构件布局结构

Android 手机卫士--自定义属性

Android 手机卫士--自定义控件(获取焦点的TextView)

自定义控件基础02_下拉刷新_侧拉菜单_自定义属性