手机安全卫士——流量管理

首先先看一下界面

布局文件都很简单,就不贴代码了!贴出主要的代码

每一个不同的程序只能有一个UId,但是一个应用里面可以有多个PId,所以我们获取每个应用程序的uid

所以我们在软件管理里面用到的AppInfo 实体类和 AppInfos 逻辑处理 类里面加入uid字段,就可以满足我们的需求。

给AppInfo.java加入

private int uid;

    public int getUid() {
        return uid;
    }
    public void setUid(int uid) {
        this.uid = uid;
    }

AppInfos.java中加入

int uid = installPackage.applicationInfo.uid;appinfo.setUid(uid);
TrafficManagerActivity .java
public class TrafficManagerActivity extends Activity {

    private List<AppInfo> appInfos;
    private ListView lv;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        // TODO Auto-generated method stub
        super.onCreate(savedInstanceState);
        initUI();
        initData();
    }

    private void initData() {
        // TODO Auto-generated method stub
        new Thread(){

            public void run() {
                //得到所有应用程序的集合
                appInfos = AppInfos.getAppInfos(TrafficManagerActivity.this);
                System.out.println("得到所有应用程序的集合 list..");

//                Message msg = new Message();
//                hanlder.sendMessage(msg);

                runOnUiThread(new Runnable() {

                    @Override
                    public void run() {
                        // TODO Auto-generated method stub
                        MyAdapter adapter = new MyAdapter();
                        lv.setAdapter(adapter);
                    }
                });
            };

        }.start();

    }

    private void initUI() {
        // TODO Auto-generated method stub
        setContentView(R.layout.activity_traffic);
        lv = (ListView) findViewById(R.id.lv);
    }

//    private Handler hanlder = new Handler(){
//        public void handleMessage(android.os.Message msg) {
//            MyAdapter adapter = new MyAdapter();
//            lv.setAdapter(adapter);
//
//        };
//    };

    public class MyAdapter extends BaseAdapter{

        @Override
        public int getCount() {
            // TODO Auto-generated method stub
            return appInfos.size();
        }

        @Override
        public Object getItem(int position) {
            return appInfos.get(position);

        }

        @Override
        public long getItemId(int position) {
            // TODO Auto-generated method stub
            return position;
        }

        @Override
        public View getView(int poition, View convertView, ViewGroup parent) {
            // TODO Auto-generated method stub

            ViewHolder holder;
            if(convertView!=null){

                holder = (ViewHolder) convertView.getTag();
            }else{
                convertView = LayoutInflater.from(TrafficManagerActivity.this).inflate( R.layout.item_traffic, null);
                holder = new ViewHolder();
                holder.icon = (ImageView)convertView.findViewById(R.id.iv_icon);
                holder.appname = (TextView) convertView.findViewById(R.id.tv_appname);
                holder.all = (TextView) convertView.findViewById(R.id.tv_all);
                holder.rx = (TextView) convertView.findViewById(R.id.tv_rx);
                holder.tx = (TextView) convertView.findViewById(R.id.tv_tx);

                convertView.setTag(holder);
            }    

            AppInfo info = appInfos.get(poition);
            holder.icon.setImageDrawable(info.getIcon());
            holder.appname.setText(info.getApkname());
            int uid = info.getUid();
            System.out.println("唯一标示: "+uid);
            long tx = TrafficStats.getUidTxBytes(uid);
            System.out.println("下载:"+tx);
            if(tx<0){
                tx = 0;
            }

            long rx = TrafficStats.getUidRxBytes(uid);
            if(rx<0){
                rx = 0;
            }
            long total = tx+rx;

            holder.rx.setText("下载:"+TextFormat.formatByte(rx));
            holder.tx.setText("上传:"+TextFormat.formatByte(tx));
            holder.all.setText("总流量:"+TextFormat.formatByte(total));

            return convertView;
        }

    }

    public class  ViewHolder{
        ImageView icon;
        TextView  appname;
        TextView tx;
        TextView rx;
        TextView all;

    }

}

TextFormat.java

import java.text.DecimalFormat;

public class TextFormat {

    /**
     * 格式化数据
     * @param data
     * @return
     */
    public static String formatByte(long data){
        DecimalFormat format = new DecimalFormat("##.##");
        if(data < 1024){
            return data+"bytes";
        }else if(data < 1024 * 1024){
            return format.format(data/1024f) +"KB";
        }else if(data < 1024 * 1024 * 1024){
            return format.format(data/1024f/1024f) +"MB";
        }else if(data < 1024 * 1024 * 1024 * 1024){
            return format.format(data/1024f/1024f/1024f) +"GB";
        }else{
            return "超出统计范围";
        }
    }
}
时间: 2024-08-01 07:06:26

手机安全卫士——流量管理的相关文章

山寨山寨版手机安全卫士项目

这个是模仿了一下常见的手机安全卫士的应用的源码的,基本是实现了常用的功能的了,不过有的还是不够完善,大家可以多多研究一下吧. 源码项目下载:http://code.662p.com/view/7227.html Screenshot_2014-05-11-03-44-01.png (287.72 KB, 下载次数: 0) Screenshot_2014-05-19-21-24-41.png (2.78 MB, 下载次数: 0) Screenshot_2014-05-19-21-38-01.png

手机安全卫士------自动更新的设置

由于手机安全卫士每次打开都要进行检查软件版本的工作,久而久之会浪费用户的流量.因此,我们要在设置页面中,由用户自己确认是否需要开启检查更新的操作. 效果图: 技术点: 1.自定义组合控件 2.SharedPreferences的读写操作 自定义组合控件 和之前自定义风格的原因一样,都是为了减少工作量.由于该组合控件会有很多地方要用到,因此,我们把它抽取出来,封装在一个类中,需要使用的时候直接调用即可.一劳永逸! 思路: 创建一个布局文件,包括两个TextView,一个CheckBox如效果图的形

山寨山寨版手机安全卫士源码项目

这个是模仿了一下常见的手机安全卫士的应用的源码的,基本是实现了常用的功能的了,不过有的还是不够完善,大家可以多多研究一下吧. 详细说明:http://android.662p.com/thread-5444-1-1.html Screenshot_2014-05-11-03-44-01.png (287.72 KB, 下载次数: 0) Screenshot_2014-05-19-21-24-41.png (2.78 MB, 下载次数: 0) Screenshot_2014-05-19-21-38

手机安全卫士03

手机安全卫士03 今天做的东西有点乱,之后再来整理 一.Splash界面 软件下载 Xutils 框架 (四大模块) – BitmapUtils – HttpUtils – DBUtils – ViewUtils 进度条展示 调用系统的安装器安装软件 1.升级apk : 检测包名一致 , 版本号大于当前的版本 , 签名要一致 二.Home 主页 搭建Home界面 GridView的使用 - 文本框字幕滚动 LogUtil 日志工具类 ## 三.自定义控件 好处: 自定义功能 TextView –

【边做项目边学Android】手机安全卫士01:splash界面ui

手机安全卫士项目是跟着黑马的视频做的. splash是飞洒.飞溅的意思,主要是用于完成一个产品logo显示,期间可以: 后台完成数据库初始化的操作 联网访问服务器,获取服务器最新信息(升级提示) 不同的日期显示出来不同logo,判断当前系统时间,素材一般从服务器上下载下来. 判断时间,根据不同时间显示不同的加载页面 布局文件:splash.xml <?xml version="1.0" encoding="utf-8"?> <LinearLayou

手机安全卫士04

手机安全卫士04 一. 手机防盗流程介绍 二.LostFindActivity 手机防盗类设计与实现 是否第一次进入 is_first_use 手机防盗功能界面 xutil 的ViewUtils 模块 三.设置向导 欢迎使用手机防盗界面 Activity切换动画 详情请参考 http://blog.csdn.net/bufanni12/article/details/26453725 Activity在切换或者是退出的时候可以使用渐入,滑动,缩放等动态效果.使用的就是方法overridePend

手机安全卫士学习(2)

今天是安全卫士学习第二天,主要涉及以下内容: 1 安全卫士主页面的布局 其中涉及gridview的使用,包括布局文件的引用,以及自定义控件textview <?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"    android:layout_width=&qu

手机安全卫士——主界面的开发

activity_home.xml <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent

android手机安全卫士、Kotlin漫画、支付宝动画、沉浸状态栏等源码

Android精选源码 轻量级底部导航栏 android手机卫士源码 android实现高仿今日头条源码 一个用Kotlin写的简单漫画App源码 android吐槽项目完整源码 实现可以滑动文字逐渐变色的TabLayout android实现将app隐藏加密功能的源码 android实现横向滚动的卡片堆叠布局 android仿支付宝的咻咻动画源码 android状态栏和沉浸式导航栏管理源码 Android优质博客 从BaseActivity与BaseFragment的封装谈起 这篇博客主要是从