zoukankan      html  css  js  c++  java
  • 手机卫士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来提示用户,提高用户体验

  • 相关阅读:
    sql2slack alash3al 开源的又个轻量级工具
    pgspider fetchq 扩展docker镜像
    godns 集成coredns 的demo
    godns 简单dnsmasq 的dns 替换方案
    aviary.sh 一个基于bash的分布式配置管理工具
    使用coredns 的template plugin实现一个xip 服务
    nginx 代理 coredns dns 服务
    基于nginx proxy dns server
    几个不错的geodns server
    spring boot rest api 最好添加servlet.context-path
  • 原文地址:https://www.cnblogs.com/adventurer/p/5605434.html
Copyright © 2011-2022 走看看