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