关于黑马手机卫士的学习总结
經(jīng)過一個(gè)多月的不懈努力,終于完成了這個(gè)手機(jī)衛(wèi)士的項(xiàng)目。時(shí)間都是擠出來(lái)的,不容易啊。現(xiàn)在稍稍的總結(jié)一下,分享給大家http://pan.baidu.com/s/1qY10Ffu
(一)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次以上 基本上解不出來(lái),銀行支付寶密碼都采用多次加密
(三)手機(jī)防盜
1,功能抽取(設(shè)置向?qū)?#xff09;
? ? ? ? 動(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_MENU
5,sim卡變更報(bào)警
? ? ? ?1,監(jiān)聽開機(jī)啟動(dòng)的廣播
? ? ? ? ? ? android.intent.action.BOOT_COMPLETED
? ? ? ?2,獲取sim信息
? ? ? ? ? ? ? TelephoneManager 獲取sim卡
? ? ? ?3, 原來(lái)的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() {
@Override
public 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ǔ)句優(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)用該方法,來(lái)確定多少個(gè)數(shù)據(jù)顯示
? ? getView();
? ? ? ? ? ?最重要
? ? ? ? ? ? ? ? view緩存的復(fù)用
? ? ? ? ? ? ? ? ? ? ?注意緩存view的類型
? ? ? ? ? ?緩存:
? ? ? ? ? ? ? ? 解決頻繁調(diào)用findViewById
? ? getItem();
? ? ? ? ? ? ?獲取數(shù)據(jù),通過調(diào)用listview.getItemAtPosition
? ? ? ? ? ? ?調(diào)用該方法來(lái)獲取
? ? 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
? ? ? ? ? ? ? ?//直接可以使用命令刪除apk
RootTools.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 來(lái)獲取運(yùn)行中的進(jìn)程
List<RunningAppProcessInfo> runningAppProcesses = am
.getRunningAppProcesses();
2,獲取內(nèi)存
? ? ?總內(nèi)存:讀取文件來(lái)獲取總內(nèi)存大小 /proc/meminfo
? ? ?可用內(nèi)存:
? ? ? ? ? MemoryInfo outInfo = new MemoryInfo();
// MemoryInfo 存放內(nèi)存的信息
am.getMemoryInfo(outInfo);
// 把kb 轉(zhuǎn)換成byte
size = 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方法
? ? ? ? ? @Override
public 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來(lái)獲取緩存
? ? ? 參考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來(lái)顯示數(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類的下面方法
? ? ? ? ? ? ? @Override
public 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ù)棧中獲取頂部activity
String packName = runningTaskInfo.topActivity
.getPackageName();
? ? ? ?判斷是否攔截
? ? ? ? ? ? ?如果是攔截
? ? ? ? ? ? ? ? ? ? 判斷是否是熟人
? ? ? ? ? ? ? ? ? ? ? ? ? ?廣播來(lái)接受熟人的信息
? ? ? ? ? ? ? ? ? ? 不是熟人
? ? ? ? ? ? ? ? ? ? ? ? ? 輸入密碼的界面
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?如果輸入的是正確的密碼,發(fā)送熟人廣播
(十)設(shè)置中心
? ? ?黑名單攔截服務(wù)
? ? ? ? ? ? ?電話攔截
? ? ? ? ? ? ? ? ? ? 如果是黑名單電話,掛斷電話和刪除電話日志
? ? ? ? ? ? ? ? ? ? 掛斷電話:反射和aidl
? ? ? ? ? ? ? ? ? ? 刪除電話日志:注冊(cè)內(nèi)容觀察者
? ? ? ? ? ? ?短信攔截
? ? ? ? ? ? ? ? ? ? 終止短信的廣播傳遞
? ? ?來(lái)電歸屬地:
? ? ? ? ? ? ? ? ?自定義Toast來(lái)顯示歸屬地
? ? ? ? ? ? ? ? ? ? ? 在WindowManager中 addView(土司的view)
? ? ? ? ? ? ? ? ? ? ? 觸摸事件
? ? ? ? ? ? ? ? ? ? ? 土司的類型
? ? ? ? ? ? ? ? ?歸屬的樣式:
? ? ? ? ? ? ? ? ? ? ? ? ? ? ?設(shè)置背景資源
? ? ?是否更新:
? ? ? ? ? ? ? ?在sp保存標(biāo)記,在splash界面判斷該標(biāo)記
? ? ? ? ? ? ?
?
? ? ? ??
? ? ? ? ? ??
? ? ?
?
總結(jié)
以上是生活随笔為你收集整理的关于黑马手机卫士的学习总结的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 计算机会计综合实训心得体会,会计电算化实
- 下一篇: update my laptop, cp