zoukankan      html  css  js  c++  java
  • 手机卫士10_widget_流量统计_手机杀毒

    1._widget入门:

    查看帮助文档>>Developrs>>API Guides>>App Widgets

    实际上是一个迷你的应用程序VIew视图,嵌入在另外一个应用程序视图.

    标准的android和兼容widget的手机才能显示,被修改过的系统是无法显示的.

    实现步骤:

    ①创建类继承APPWidgetProvider//一个方便的帮助类,用来实现一个appwidget

    它继承了广播接收者,实现原理也是通过广播实现的,特殊的广播接收者.

    ②在清单文件里配置广播接收者,拷贝帮助文档的配置数据,修改receivername属性,meta-data中的resource属性

    meta-data文件内容,拷贝帮助文档的内容即可.其中initialLayout widget的样式.

    额外:带有桌面小空间Widget的应用被安装在sd卡中,是扫描不到的.

    ①修改清单文件中的安装位置,②卸载原程序.

    可以考虑拷贝金山的相关样式,会比较好看(反编译获取到所有资源文件.)

    2.更新 widget中的信息.

    因为widget是嵌入再别的应用程序中的,桌面应用中有一个appwidgetManager的小控

    件管理器,通过这个管理器就可以去更新数据.

    ①创建一个服务类,因为需要在后台运行更新所以需要定义计时器和计时器任务

    定义两个变量:Timer计时器,TImerTask计时器执行的任务.

    Timer.schedule(任务,0(开始时间),3000(循环时间)).

    ②创建一个小控件管理器AppWidgetManager awm = AppwidgetManager.getInstance(this)

    awm.updateAppWidget(provider,RomteViews);

    RomteViews是一个实现了Parcelable的接口(seriazable接口)

    由于更新的是桌面进程里的远程View对象,所以要把手机卫士里面的View传递过来,并且这个View是可以被序列化.

    RomteViews views = new RomteViews(包名,布局文件);

    //设置其中的文本,远程view不能直接findViewById

    views.setTextViewText(id,文本);

    getApplicationContext()//获得应用程序的上下文.s

    ③组件名ComponentName provider = new (上下文,组件.class);

    widget的生命周期方法

    onEnabled(context)//widget被创建了 在创建的时候开启更新数据服务

    onDisabled(context)//widget 被销毁了,在销毁的时候取消更新数据服务

    3 Widget 的点击事件

    RomteViews views

    views.setOnClickPending(id,pendingIntent);//相当于view对象的onClickListener

    PendingIntent是一个描述,描述的是一个intent要执行的动作,可以用来发送广播,开启服务.把一个PendingIntent给另外一个应用程序.

    表示的是一个引用,让另外一个进程帮我们执行想要执行的意图.

    PendingIntent(延期的意图) pendingintent = PedingIntent.getBroadCast(context,请求码为0即可,intent(意图),flags(执行一次,新的覆盖旧的等))//发送一个广播的延期意图

    Intent.setAction(“com.zzx.mobilesage.killapp”);//指定一个发送广播动作,可自定义

    ②创建一个广播接收者,指定过滤器中的 Action,就是上面自定义的Action.

     接收到了广播之后创建进程管理器,然后拿到所有进程的包名,全部kill

    (在服务类会自动定时更新数据,这里就不用再更新了)

    4,流量统计(模拟器的流量是假的,获取不到,真实手机获取的数据可靠)

    ①创建一个新的activity:TrafficManagerActivity.

    ②抽屉控件的使用

    在布局文件中,新的节点:SlidingDrawer//可以滑动的抽屉

    SlidingDrawer必须要有子节点,背景和样式

    重要属性:handler = “@+id/名字” //拖动的把手

     Content=”@+id/内容” //抽屉的内容

    SlidingDrawer中的子控件中

    id属性为id=”@id/handler”//如果是把手的样式就指定把手的id

    //报错,content作为一个内容也必须要有一个子控件继承id

    额外:指定抽屉的方向orientation属性,可以从右向左拖动//后面会谈到自定义控件,就能从左往右或从上往下拖动.

    ③界面:

    用一个帧布局包括抽屉,可以显示抽屉没抽出之前的布局(后面的布局会覆盖前面的)

    不要给整个SlidingDrawer设置背景颜色,要给内容的设置,不然颜色很蛋疼的

    ④流量相关api

    TrafficStats.getTotalTxBytes(); //获取全部的translatebyte,获取上传的全部流量.

    TrafficStats.getTotalRxBytes(); //获取全部的下载的流量

    全部流量 = 全部上传 + 全部下载

    TrafficStats.getMobileRxBytes(); //获取移动网络下载的总数据

    TrafficStats.getMobileTxBytes(); //获取移动网络上传的总数据

    移动网络 = 移动全部上传 + 移动全部下载

    单个应用程序的流量信息获取

    TrafficStats.getUidRxBytes(uid);

    TrafficStats.getUidTxBytes(uid);

    //获取应用程序的用户id

    通过包管理器中的所有包信息的集合,每一个包信息对应的应用程序info可以看到uid.  uid如果是1000,三位数开始的,一般就是内核应用.

    5,TrafficStats 流量统计的实现原理

    Linux系统,Windows系统都有一个配置文件去记录流量统计数据(必须要真实手机才看得到)

    adbDOS命令中查看真实手机

    adb - s 手机名 shell

    ls 查看文件夹结构

    Proc 目录(系统配置和运行信息)>>uid_stat 用户id状态目录>>对应的文件夹名就是对应的应用程序uid,开头为-号就代表文件>>tcp_rcv,tcp_snd,接收和上传的数据>>cat 文件名,可以看到里面的具体数据.

    市面上的自动校准流量就是发送流量查询短信给运营商(10086,10000)获得返回解析.

    流量监控,统计每一天的流量信息(每一天凌晨获取一次数据,每隔XX时间获取一次数据,进行计算之后,保存在数据库,然后显示在页面上即可).

    6,手机杀毒功能

    杀毒软件工作的原理:基于特征码进行杀毒(本质上还是一段指令或代码)

    MD5唯一串.

    SHA1,数字摘要,特征码,校验文件是否被修改过,被修改过,特征码也会变.

    ①获取特征码的步骤

    创建文件输入流.

    创建MessageDigest  = MessageDigest.getInstances(“SHA1”);

    //如果文件比较大,把输入流分段

    Byte[]arr = new byte[]{1024};

    Int len = 0;

    while循环读取数据,读取一次,digest.update(arr,0,len);//提取数据摘要

    Byte[] resultt =digest.digest();//把读取的数据拿取出来

    创建StringBuffer sb//遍历byte数组转换成字符串操作

    Byte a&0xff,转换成int,再转换成十六进制数.然后sb.append()添加,最后toString().

    //判断是否是一位还是两位.一位就加个0,让格式好看一些.也更容易解读一些.

    文件名或路径发生变化,不会影响SHA1,数字摘要,当内容发生变化就不一样.

    杀毒原理,获取到每一个文件的数字摘要,匹配病毒数据库即可.

    金山的病毒数据库antivirus.db,解包它的apk文件可以得到,查看数据库文件内容可以看到,

    7,病毒查杀页面的ui

    圆盘查杀进度,本质是一个圆盘图片上覆盖一个阴影图片,这个阴影图片随着查杀进度改变自身的位置(或者说是动画.)覆盖图片用帧布局比较方便.

    旋转动画:RotateAnimation,0360,根据图片设置中心位.

    设置播放时间,播放次数,循环次数,如果觉得旋转状态不好看,把角度设小一点或者大一点.

    参考ui:

    下面空白部分就是一个LinearLayout的控件,用来显示扫描的条目

    8,扫描系统里每个应用程序的特征码:

    ①把病毒特征码数据库存放在资产目录,splash界面把数据库通过io 流保存到私有文件夹下.

    可以考虑把数据库拷贝动作,做成一个工具类,目标文件夹和资产目录始终不变,变的只有文件名.

    ②定义查杀病毒的方法,参考名scanVirus();

    扫描每个应用程序会比较耗时,可以考虑放到子线程中

    ③遍历每一个应用程序的apk,获取它的特征码.

    获取包管理器,获取所有包信息,通过应用程序信息.sourceDis//获取每个应用程序的文件路径.

    把路径转换为文件对象,(根据不同的算法,MD5,还是SHA1得到数据摘要值.MessageDigest)

    ④获取摘要值,查询数据库是否有这一条记录.//通过SQLiteDataBase.openDataBase()打开数据库.

    之后就是查询,判断结果,记得对比数据库中的列名,用户想看到的只有病毒描述列.

    每扫面一个应用程序就打印一次结果:应用程序的Label + 结果 的提示效果

    ⑤动态更新ui的LinearLayout显示文本和进度条.

    显示进度 略

    额外:①显示文本,扫描一条就给LinearLayout增加一个文本控件.

    由于是在子线程,所以要通过handler发送到主线程更新或增加控件

    ②addView(view,0)//增加控件到第一个位置上,效果更好.

    扫描完之后圆盘动画停止clearAnimation.(或者隐藏掉阴影),进度条上的TextView文本也发生改变

    ③扫描结果可以上下拖动,ScrollView包裹LinearLayout,它的进度条不好看,设置属性为gone

        android:scrollbars="none"

     

  • 相关阅读:
    Nginx负载均衡配置
    云鹏在美团八年工作总结
    尽量不要让儿女从事这3种工作,钱再多也别做,坚持再久也没前途
    Nginx 配置ip_hash
    postgresql获取表结构,表名、表注释、字段名、字段类型及长度和字段注释
    更快的Maven来了,我的天,速度提升了8倍!
    Nginx负载均衡配置及算法详解
    nginx负载均衡策略:ip_hash、url_hash
    Windows Phone实用开发技巧(41):解决WebBrowser中显示黑色背景网页闪屏
    Windows Phone实用开发技巧(32):照片角度处理
  • 原文地址:https://www.cnblogs.com/adventurer/p/5602139.html
Copyright © 2011-2022 走看看