手机安全卫士第七天

手机安全卫士第七天实现的功能:

1.短信备份。

2.快捷图标的创建。

3.进程的界面显示。


首先进行的是短信备份功能,在高级工具布局文件中添加"短信备份",并处理其点击事件,点击之后备份短信到sd卡,备份短信需要使用内容提供者和解析者得到数据,然后用serializer进行xml存储,如果短信过多的话在主线程运行可能出现ANR,所有需要在子线程中进程存储,由于可能有经常改需求的必要,所有可以把不确定需求的抽取为接口,然后进行回调。接口的代码如下,在接口中,首先抽取了两个方法供实现类实现,分别为ProgressDialog的最大值和当前值,然后提供备份短信的方法,首先判断有无SD卡,然后拿到短信的数据用serializer进行存储。

<span style="font-size:14px;">public class SmsUtils{
    /**
     * 备份短信的接口
     * @author Administrator
     *
     */
    public interface BackUpCallBackSms{

        public void befor(int count);

        public void onBackUpSms(int process);

    }

    public static boolean backUp(Context context,BackUpCallBackSms backUpCallBackSms){
        /**
         * 目的 : 备份短信:
         * 1 判断当前用户的手机上面是否有sd卡
         * 2 权限 --- 使用内容观察者
         * 3 写短信(写到sd卡)
         */
        // 判断当前sd卡的状态
        if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)){
            // 如果能进来就说明用户有SD卡
            ContentResolver resolver = context.getContentResolver();
            // 获取短信的路径
            Uri uri = Uri.parse("content://sms/");
            // type = 1 接收短信
            // type = 2 发送短信
            // cursor 表示游标的意思
            Cursor cursor = resolver.query(uri, new String[]{"address",
                    "date", "type", "body"}, null, null, null);
            //获取当前有多少条短信
            int count = cursor.getCount();
            //设置PD的最大值
            backUpCallBackSms.befor(count);
            //设置当前的已备份的短信值
            int process = 0;
            try {
                // 把短信备份到sd卡 第二个参数表示名字
                File file = new File(Environment.getExternalStorageDirectory(),"sms.xml");
                FileOutputStream fos = new FileOutputStream(file);
                // 得到序列化器
                // 在android系统里面所有有关xml的解析都是pull解析
                XmlSerializer serializer = Xml.newSerializer();
                // 把短信序列化到sd卡然后设置编码格式
                serializer.setOutput(fos, "utf-8");
                // standalone表示当前的xml是否是独立文件 ture表示文件独立。yes
                serializer.startDocument("utf-8", true);
                // 设置开始的节点 第一个参数是命名空间。第二个参数是节点的名字
                serializer.startTag(null, "smss");
                //设置smss节点上面的属性值 第二个参数是名字。第三个参数是值
                serializer.attribute(null, "size", String.valueOf(count));
                while (cursor.moveToNext()){
                    serializer.startTag(null, "sms");
                    serializer.startTag(null, "address");
                    serializer.text(cursor.getString(0));
                    serializer.endTag(null, "address");
                    serializer.startTag(null, "date");
                    serializer.text(cursor.getString(1));
                    serializer.endTag(null, "date");
                    serializer.startTag(null, "type");
                    serializer.text(cursor.getString(2));
                    serializer.endTag(null, "type");
                    serializer.startTag(null, "body");
                    //读取短信的内容
                    /**
                     * 加密:第一个参数表示加密种子(密钥)
                     *     第二个参数表示加密的内容
                     */
                    serializer.text(Crypto.encrypt("123", cursor.getString(3)));
                    serializer.endTag(null, "body");
                    serializer.endTag(null, "sms");

                    process++;
                    backUpCallBackSms.onBackUpSms(process);
                    SystemClock.sleep(50);
                }
                cursor.close();
                serializer.endTag(null, "smss");
                serializer.endDocument();

                fos.flush();
                fos.close();
                return true;
            } catch (Exception e) {
                e.printStackTrace();
            }

        }
        return false;
    }
}</span>
然后实现点击备份短信的监听事件,直接调用备份短信的方法即可。

/**
     * 备份短信
     * @param view
     */
    public void backUpsms(View view) {
        mProgressDialog = new ProgressDialog(AtoolsActivity.this);
        mProgressDialog.setTitle("提示");
        mProgressDialog.setMessage("稍安勿躁,正在更新...");
        mProgressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
        mProgressDialog.show();
        new Thread(new Runnable() {
            @Override
            public void run() {
                boolean result = SmsUtils.backUp(AtoolsActivity.this, new SmsUtils.BackUpCallBackSms() {
                    @Override
                    public void befor(int count) {
                        mProgressDialog.setMax(count);
                    }

                    @Override
                    public void onBackUpSms(int process) {
                        mProgressDialog.setProgress(process);
                    }
                });
                if(result){
                    //安全弹吐司的方法
                    UIUtils.showToast(AtoolsActivity.this, "备份成功");
                }else{
                    UIUtils.showToast(AtoolsActivity.this, "备份失败");
                }
            mProgressDialog.dismiss();
            }
        }).start();
    }

然后进行的就是一运行程序就调价一个快捷图标了,添加快捷图标的流程是

1.干什么事情

2.叫什么名字

3.长成什么样子

创建快捷图标的方法如下,

 /**
     * 创建快捷方式
     */
    private void createShortcut() {
        Intent intent = new Intent();
        intent.setAction("com.android.launcher.action.INSTALL_SHORTCUT");
        //如果设置为true表示可以创建重复的快捷方式
        intent.putExtra("duplicate", false);
        /**
         * 1 干什么事情
         * 2 你叫什么名字
         * 3你长成什么样子
         */
        intent.putExtra(Intent.EXTRA_SHORTCUT_ICON,
                BitmapFactory.decodeResource(getResources(), R.mipmap.ic_launcher));
        intent.putExtra(Intent.EXTRA_SHORTCUT_NAME, "手机安全卫士");
        //干什么事情
        /**
         * 这个地方不能使用显示意图
         * 必须使用隐式意图
         */
        Intent shortcut_intent = new Intent();
        shortcut_intent.setAction("mobileSafe_HomeActivity");
        shortcut_intent.addCategory("android.intent.category.DEFAULT");
        intent.putExtra(Intent.EXTRA_SHORTCUT_INTENT, shortcut_intent);
        sendBroadcast(intent);
    }
当然,还要去注册一下过滤

  <span style="font-size:14px;"><activity android:name=".activity.HomeActivity" >
            <intent-filter>
                <!-- 这个名字可以随便取 -->
                <action android:name="mobileSafe_HomeActivity" >
                </action>
                <category android:name="android.intent.category.DEFAULT" >
                </category>
            </intent-filter>
        </activity></span>

今天最后进行的是进程管理这一功能中的进程界面显示

首先在界面上显示进程有多少个,剩余内存和总内存。

首先得到进程管理者,然后调用api得到有多少个进程在运行。

 /**
     * 返回进程的总个数
     *
     * @param context
     * @return
     */
    public static int getProcessCount(Context context) {
        // 得到进程管理者
        ActivityManager activityManager = (ActivityManager) context
                .getSystemService(context.ACTIVITY_SERVICE);
        // 获取到当前手机上面所有运行的进程
        List<ActivityManager.RunningAppProcessInfo> runningAppProcesses = activityManager
                .getRunningAppProcesses();
        // 获取手机上面一共有多少个进程
        return runningAppProcesses.size();
    }
然后获取到剩余内存和总内存,剩余内存直接调用api可以得到,但是总内存由于版本太低不能使用api所有不能直接读取,要使用到android手机自带的文件进行查询,市面上的安兔兔,鲁大师也是通过此种方法进行查询的

 /**
     * 得到剩余内存
     * @param context
     * @return
     */
    public static long getAvailMem(Context context) {
        // 得到进程管理者
        ActivityManager activityManager = (ActivityManager) context
                .getSystemService(context.ACTIVITY_SERVICE);
        ActivityManager.MemoryInfo memoryInfo = new ActivityManager.MemoryInfo();
        // 获取到内存的基本信息
        activityManager.getMemoryInfo(memoryInfo);
        // 获取到剩余内存
        return memoryInfo.availMem;
    }

    /**
     * 得到总内存
     * @param context
     * @return
     */
    public static long getTotalMem(Context context) {
        // 获取到总内存
		/*
		 * 这个地方不能直接跑到低版本的手机上面 MemTotal: 344740 kB "/proc/meminfo"
		 */
        try {
            // /proc/meminfo 配置文件的路径
            FileInputStream fis = new FileInputStream(new File("/proc/meminfo"));
            BufferedReader reader = new BufferedReader(new InputStreamReader(
                    fis));
            String readLine = reader.readLine();
            StringBuffer sb = new StringBuffer();
            for (char c : readLine.toCharArray()) {
                if (c >= '0' && c <= '9') {
                    sb.append(c);
                }
            }
            return Long.parseLong(sb.toString()) * 1024;
        } catch (Exception e) {
            e.printStackTrace();
        }
        return 0;
    }

然后是实现了显示所有的进程信息,实现这个功能和第6天实现的显示所有程序功能大同小异,只是使用到的系统服务不一样而已,从使用java类用来封装信息,通过接口得到所有的进程,然后在listView中设置adapter显示给用户都是一样的过程。

详情参考:http://blog.csdn.net/dzh_19950513/article/details/51335798

源代码GitHub地址:https://github.com/AndroidDai/mobliesafe


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值