經(jīng)過一個(gè)多月的不懈努力,終于完成了這個(gè)手機(jī)衛(wèi)士的項(xiàng)目。時(shí)間都是擠出來的,不容易啊。現(xiàn)在稍稍的總結(jié)一下
,分享給大家http://pan.baidu.com/s/1jIhtrIu
(一)splash界面1,網(wǎng)絡(luò)訪問數(shù)據(jù) URL url= new URL(“地址”); HttpUtils 異步訪問服務(wù)器,回調(diào)結(jié)果在主線中執(zhí)行
case LOADMAIN: // 加載主界面case ERROR://有異常
case SHOWUPDATEDIALOG:// 顯示更新版本的對(duì)話框2, 數(shù)據(jù)拷貝 把a(bǔ)ssets目錄的數(shù)據(jù)拷貝到/data/data/包名/files目錄 子線程拷貝
//拷貝數(shù)據(jù)庫(kù)copyDB("address.db");3,動(dòng)畫效果 AlphaAnimation 漸變動(dòng)畫 AnimationSet 動(dòng)畫集 RotateAnimation 旋轉(zhuǎn)動(dòng)畫(設(shè)置錨點(diǎn)) ScaleAnimation 比例動(dòng)畫(設(shè)置錨點(diǎn)) TranslateAnimation 位置動(dòng)畫4,獲取版本號(hào)版本名 PackageManager pm = getPackageManager(); PackageInfo packageInfo = pm.getPackageInfo(getPackageName(), 0); // 版本號(hào)versionCode = packageInfo.versionCode;// 版本名versionName = packageInfo.versionName;5,異常處理 針對(duì)不同的異常做不同的處理,如404,4001,4002,4003等
6,安裝apk Intent intent = new Intent("android.intent.action.VIEW");intent.addCategory("android.intent.category.DEFAULT");String type = "application/vnd.android.package-archive";Uri data = Uri.fromFile(new File("/mnt/sdcard/xx.apk"));intent.setDataAndType(data, type);startActivityForResult(intent, 0);7,解析json數(shù)據(jù) JSONObject 簡(jiǎn)單的json數(shù)據(jù) Gson(未在該項(xiàng)目中) 復(fù)雜json數(shù)據(jù)8,代碼規(guī)范 盡量方法功能單一,注意共有功能的抽取 如: initView(); initData(); initEvent();(二)主界面1,GridView 和ListView雙胞胎,多了指定列的選項(xiàng)adapter = new MyAdapter();gv_menus.setAdapter(adapter);// 設(shè)置gridview適配器數(shù)據(jù)2, 事件和適配器和ListView的處理方式完全一樣3,自定義對(duì)話框 AlertDailog.Builder ab; ab.setView(自定義View); 自定義View 注意對(duì)話框的關(guān)閉處理 ab.create().dismiss();4, SpTool用法5, md5加密 1,文件 病毒的判斷 2,字符串 加密處理,不可逆 加密3次以上 基本上解不出來,銀行支付寶密碼都采用多次加密
(三)手機(jī)防盜1,功能抽取(設(shè)置向?qū)В?nbsp; 動(dòng)畫效果 界面跳轉(zhuǎn) 事件處理2,檢查服務(wù)是否運(yùn)行 通過ActivityManager獲取運(yùn)行的服務(wù),判斷服務(wù)是否存在3, 彈出窗體 彈出要想播放動(dòng)畫,要設(shè)置背景資源 顯示的位置: pw.showAtLocation(rl_root, Gravity.LEFT | Gravity.TOP,width / 4, height / 4); 和自定義對(duì)話框的區(qū)別: 彈出窗體可以設(shè)置任意的位置,對(duì)話框只能在屏幕中間顯示4, 自定義菜單 監(jiān)聽menu鍵的事件 keyCode == KeyEvent.KEYCODE_MENU5,sim卡變更報(bào)警 1,監(jiān)聽開機(jī)啟動(dòng)的廣播 android.intent.action.BOOT_COMPLETED 2,獲取sim信息 TelephoneManager 獲取sim卡 3, 原來的sim卡信息保存sp中,進(jìn)行判斷6,gps wifi 網(wǎng)絡(luò)ip 3g/4g 基站 gps 衛(wèi)星 LocationManager處理定位,設(shè)置定位監(jiān)聽 放到服務(wù)中去監(jiān)聽7,設(shè)備管理器用法 一鍵鎖屏 激活設(shè)備管理員,鎖屏,遠(yuǎn)程清除數(shù)據(jù)等 獲取設(shè)備管理 DevicePolicyManager dpm = (DevicePolicyManager) getSystemService(DEVICE_POLICY_SERVICE); dpm.resetPassWord("123", 0);//一鍵鎖屏 dpm.lockNow(); dpm.wipeData(DevicePolicyManager.WIPE_EXTERNAL_STORAGE);8,報(bào)警音樂 音樂播放器 為了防止重復(fù)播放 mp.setOnCompletionListener(new OnCompletionListener() {@Overridepublic void onCompletion(MediaPlayer mp) {//音樂播放完畢,觸發(fā)此方法isPlay = false;}});; (四)黑名單數(shù)據(jù)1,自定黑名單數(shù)據(jù)庫(kù) 繼承SQLiteOpenHelper類2,分頁(yè) 1,設(shè)置顯示數(shù)據(jù)的個(gè)數(shù) 2,取所有數(shù)據(jù) 計(jì)算出多少頁(yè) 3, 取出每頁(yè)的數(shù)據(jù) select * from blacktb order by _id desc limit 數(shù)據(jù)個(gè)數(shù) offset 起始位置; select * from blacktb limit 起始位置 , 結(jié)束位置;3,sql語句優(yōu)化 只是判斷是否有數(shù)據(jù),select 常量 from 表名 結(jié)構(gòu)設(shè)計(jì): 三大范式4, 界面顯示黑名數(shù)據(jù) 耗時(shí)的處理 子線程訪問數(shù)據(jù) new Thread(){ public void run(){發(fā)送不同的狀態(tài) //數(shù)據(jù)更新界面 adapter.notifyDataSetChange(); } }.start(); handler = new Handler(){ public void handleMessage(Message msg){ //處理不同狀態(tài) } }5, adapter的用法 getCount(); 界面調(diào)用該方法,來確定多少個(gè)數(shù)據(jù)顯示 getView(); 最重要 view緩存的復(fù)用 注意緩存view的類型 緩存: 解決頻繁調(diào)用findViewById getItem(); 獲取數(shù)據(jù),通過調(diào)用listview.getItemAtPosition 調(diào)用該方法來獲取 getItemId(); 不用 注意: 界面顯示的位置 ,同過這些位置取數(shù)據(jù)顯示,界面不顯示的位置,不取數(shù)據(jù)6,啟動(dòng)app // 通過包名獲取意圖Intent launchIntentForPackage = pm.getLaunchIntentForPackage(packName); 注意沒有界面的app處理7,分享app短信 分享微博8,刪除app 用戶app Intent intent = new Intent("android.intent.action.DELETE");intent.addCategory("android.intent.category.DEFAULT");intent.setData(Uri.parse("package:" + clickBean.getPackName()));startActivity(intent);// 刪除用戶apk的Activity 系統(tǒng)app //直接可以使用命令刪除apkRootTools.sendShell("mount -o remount rw /system", 8000);//設(shè)置命令的超時(shí)時(shí)間為8秒System.out.PRintln("安裝路徑:" + clickBean.getApkPath());RootTools.sendShell("rm -r " + clickBean.getApkPath(), 8000);RootTools.sendShell("mount -o remount r /system", 8000);(五)進(jìn)程管理1,獲取進(jìn)程信息 ActivityManager 來獲取運(yùn)行中的進(jìn)程List<RunningAppProcessInfo> runningAppProcesses = am.getRunningAppProcesses();2,獲取內(nèi)存 總內(nèi)存:讀取文件來獲取總內(nèi)存大小 /proc/meminfo 可用內(nèi)存: MemoryInfo outInfo = new MemoryInfo();// MemoryInfo 存放內(nèi)存的信息am.getMemoryInfo(outInfo);// 把kb 轉(zhuǎn)換成bytesize = outInfo.availMem;3,迭代器操作數(shù)據(jù) 容器不能增刪修改 list對(duì)象增刪改中標(biāo)記 if (ourList.modCount != expectedModCount) { throw new ConcurrentModificationException(); }4,清理進(jìn)程 am.killBackgroundProcesses(bean.getPackName());5,listview過濾顯示數(shù)據(jù) 只需要修改getCount方法 @Overridepublic int getCount() {setTileMessage();if (!SpTools.getBoolean(getApplicationContext(), MyConstants.SHOWSYSTEM, false)) {//不顯示系統(tǒng)進(jìn)程return userTasks.size() + 1;}return sysTasks.size() + 1 + userTasks.size() + 1;}(六)流量統(tǒng)計(jì) 真機(jī): 流量信息的位置 /proc/uid_stat/id名/tcp_snd 發(fā)送流量 /proc/uid_stat/id名/tcp_rcv 接收流量 流量類型 //流量信息的管理類cm = (ConnectivityManager) getSystemService(CONNECTIVITY_SERVICE);(七)殺毒1,病毒數(shù)據(jù)庫(kù)的創(chuàng)建 拷貝金山的病毒數(shù)據(jù) 病毒判斷主要靠病毒文件的MD5值 或 sha1 2,病毒庫(kù)更新 讀取版本號(hào)判斷 12 50 從數(shù)據(jù)庫(kù)中動(dòng)態(tài)取沒有的病毒數(shù)據(jù)3,查殺病毒 掃描系統(tǒng)中所有的文件 判斷MD5值,刪除文件(申請(qǐng)root權(quán)限)(八)緩存清理1,獲取緩存 反射和aidl來獲取緩存 參考setting的源碼,找到獲取緩存的代碼 ApplicationState.java 787行2, 清理緩存 1,單個(gè)app的緩存 系統(tǒng)app才可以有權(quán)限是清除 打開設(shè)置中心 2,清除所有緩存 pm.freeDataAndNotify 3,緩存回調(diào)信息 在子線程中執(zhí)行(九)高級(jí)工具 1,手機(jī)歸屬查詢 手機(jī)歸屬地?cái)?shù)據(jù)庫(kù) 抖動(dòng)(ApiDemo) 震動(dòng)(真機(jī)) 監(jiān)聽文本的變化2, 短信的備份和還原 json xml 界面的顯示 接口完成界面的回調(diào)顯示3, 程序鎖1,數(shù)據(jù) fragment來顯示數(shù)據(jù) 程序鎖數(shù)據(jù)庫(kù) 數(shù)據(jù)緩存 數(shù)據(jù)一致 內(nèi)容觀察者 1,注冊(cè)內(nèi)容觀察者 getContentResolver().registerContentObserver(LockedTable.uri, true, observer); observer: 實(shí)現(xiàn)ContentObserver類的下面方法 @Overridepublic void onChange(boolean selfChange) {new Thread(){public void run() {LockedDao dao = new LockedDao(getApplicationContext());//讀取dao層讀取數(shù)據(jù)List<String> allLockedDatas = dao.getAllLockedDatas();//如果是實(shí)例變量 allLockedDatas.clear() .addAll();lockedFragment.setAllLockedPacks(allLockedDatas);unlockedFragment.setAllLockedPacks(allLockedDatas);};}.start();super.onChange(selfChange);} uri: content://uricontent/xxtb/xxlie 2, 發(fā)送內(nèi)容觀察者通知(自定義) // 發(fā)送內(nèi)容觀察者的通知context.getContentResolver().notifyChange(LockedTable.uri, null); 注意: uri要一致 動(dòng)畫效果:位移動(dòng)畫 2,看門狗服務(wù) 看門狗的監(jiān)控任務(wù)棧 List<RunningTaskInfo> runningTasks = am.getRunningTasks(1);// 獲取最新的任務(wù)棧RunningTaskInfo runningTaskInfo = runningTasks.get(0);// 最新打開的任務(wù)棧// 任務(wù)棧中獲取頂部activityString packName = runningTaskInfo.topActivity.getPackageName(); 判斷是否攔截 如果是攔截 判斷是否是熟人 廣播來接受熟人的信息 不是熟人 輸入密碼的界面 如果輸入的是正確的密碼,發(fā)送熟人廣播(十)設(shè)置中心 黑名單攔截服務(wù) 電話攔截 如果是黑名單電話,掛斷電話和刪除電話日志 掛斷電話:反射和aidl 刪除電話日志:注冊(cè)內(nèi)容觀察者 短信攔截 終止短信的廣播傳遞 來電歸屬地: 自定義Toast來顯示歸屬地 在WindowManager中 addView(土司的view) 觸摸事件 土司的類型 歸屬的樣式: 設(shè)置背景資源 是否更新: 在sp保存標(biāo)記,在splash界面判斷該標(biāo)記
新聞熱點(diǎn)
疑難解答
圖片精選
網(wǎng)友關(guān)注