【正文】
所示。P r e f e r e n c e S c r e e nC h e c k B o x P r e f e r e n c es h e z h i . x m lE d i t T e x t P r e f e r e n c e C h e c k B o x P r e f e r e n c eE d i t T e x t P r e f e r e n c e C h e c k B o x P r e f e r e n c e圖 文件構(gòu)架控件屬性在本軟件中的應(yīng)用如圖 所示。P r e f e r e n c e S c r e e ns h e z h i . x m lt i t l es u m m a r yC h e c k B o xP r e f e r e n c e t i t l es u m m a r yC h e c k B o xP r e f e r e n c e t i t l es u m m a r yC h e c k B o xP r e f e r e n c e d i a l o g T i t l es u m m a r yE d i t T e x tP r e f e r e n c ed i a l o g T i t l es u m m a r yE d i t T e x tP r e f e r e n c et i t l ek e yP o s i t i v eB u t t o n T e x tN e g a t i v eB u t t o n T e x tt i t l ek e yP o s i t i v eB u t t o n T e x tN e g a t i v eB u t t o n T e x t圖 文件屬性構(gòu)架其代碼就是對(duì)屬性進(jìn)行相應(yīng)配置即可如 android:password=true等,這里就不做詳細(xì)介紹了,具體代碼請(qǐng)看附錄二。 DialogDialog 是 android 開發(fā)過(guò)程中最常用到的組件之一,它包括以下幾種類型:1. 警告對(duì)話框:Alertialog 2. 進(jìn)度對(duì)話框:ProgressDialog 3. 日期選擇對(duì)話框:DatePickerDialog 4. 時(shí)間選擇對(duì)話框:TimePickerDialog 5. 自定義對(duì)話框:從 Dialog 繼承 Dialog 的創(chuàng)建方式有兩種:一是直接 new 一個(gè) Dialog 對(duì)象,然后調(diào)用 Dialog 對(duì)象的 show 和 dismiss 方法來(lái)控制對(duì)話框的顯示和隱藏。二是在 Activity 的 onCreateDialog(int id)方法中創(chuàng)建 Dialog 對(duì)象并返回,然后調(diào)用 Activty 的 showDialog(int id)和 dismissDialog(int id)來(lái)顯示和隱藏對(duì)話框。區(qū)別在于通過(guò)第二種方式創(chuàng)建的對(duì)話框會(huì)繼承 Activity 的屬性,比如獲得Activity 的 menu 事件等。本軟件就采用第二種方法用于顯示彈出的對(duì)話框。其程序流程圖如圖 所示。創(chuàng)建一個(gè) D i a l o g 方法應(yīng)用s e t O n C l i c kL i s t e n e r 綁定監(jiān)聽器用戶點(diǎn)擊按鈕事件用 in fl at e方法渲染調(diào)用 la yo ut等待用戶點(diǎn)擊事件NYL a y o u t主框架判斷點(diǎn)擊的按鈕是 Y / N判斷密碼是否不為空判斷密碼與原密碼是否一致YY提示錯(cuò)誤信息退出應(yīng)用程序N進(jìn)入應(yīng)用程序NNY圖 Dialog 流程圖? java 文件關(guān)鍵代碼如下:1234567891011121314151617//首先先創(chuàng)建一個(gè) Dialog 函數(shù)private void putPWDialog() {//渲染布局文件 LayoutInflater inflater = (this)。 View view = (, null)。 //生成 Dialog 對(duì)象并進(jìn)行設(shè)置 builder = new (this)。(輸入密碼)。//顯示 Dialog 界面(view)。showputPWDialog = ()。()。//監(jiān)聽確定按鈕(new OnClickListener() {//信息核對(duì)提示if(().equals()) {else if(().equals(savedPassword)) {18192021222324else{}//監(jiān)聽退出按鈕(new OnClickListener() {//完全退出程序public void onClick(View v) {().exit()。}經(jīng)過(guò)大量的調(diào)整、核對(duì)以及調(diào)試,我們的 UI 界面就這樣完成啦。到此為止把我們的軟件安裝到手機(jī)上就可以進(jìn)行所有界面的切換了。 由 Sever 支持的 Function 實(shí)現(xiàn)有了完整的 UI,我們就可以在 Function 里實(shí)現(xiàn)這些 UI 對(duì)應(yīng)的功能。對(duì)于任何一個(gè)軟件來(lái)說(shuō),無(wú)論它有什么樣的 UI,人們最終想要獲得的還是軟件的功能。所以,只有 Function 的完美實(shí)現(xiàn)才能體現(xiàn)出一個(gè)軟件的真正價(jià)值。 廣播機(jī)制服務(wù)之前已經(jīng)介紹了 Android 系統(tǒng)中廣播機(jī)制的概念,這里就主要說(shuō)明在本軟件中所用到的 3 種廣播——開機(jī)完成廣播、服務(wù)狀態(tài)廣播和短信接收廣播。開機(jī)完成廣播和服務(wù)狀態(tài)廣播用于監(jiān)測(cè) SIM 卡的狀態(tài)改變。當(dāng)用戶開機(jī)完成時(shí),系統(tǒng)就會(huì)向接收開機(jī)完成廣播的應(yīng)用軟件發(fā)送開機(jī)完成廣播,告訴他們已完成開機(jī)動(dòng)作,此時(shí)軟件就可以在接收此指令后做出自己需要的動(dòng)作,例如開機(jī)運(yùn)行的軟件就都需要接收開機(jī)完成廣播。服務(wù)狀態(tài)廣播也是同樣的原理,當(dāng)手機(jī)檢測(cè)到信號(hào)后就會(huì)由系統(tǒng)向所有應(yīng)用發(fā)送服務(wù)狀態(tài)改變的廣播。短信接收廣播是當(dāng)手機(jī)接收到短信時(shí) Android 系統(tǒng)向應(yīng)用程序發(fā)送的一種廣播。手機(jī)系統(tǒng)中自帶的有些功能都要通過(guò)這種廣播來(lái)完成動(dòng)作。例如手機(jī)收到短信時(shí)會(huì)產(chǎn)生音樂和振動(dòng)等狀態(tài),這就是由短息模塊在接收到系統(tǒng)短信接收廣播后作出的動(dòng)作。為了接收來(lái)自系統(tǒng)的廣播,Android 為開發(fā)者提供了一個(gè)專門用于接收廣播的類既BroadcastReceiver 類,本軟件就通過(guò)繼承此類實(shí)現(xiàn)接收所有廣播。在 Android 中光有接收的類還不行,要想讓系統(tǒng)把廣播發(fā)送到你的應(yīng)用程序還必須在 文件中進(jìn)行權(quán)限注冊(cè),讓系統(tǒng)知道你需要接收廣播并給你開放ROOT 允許你使用才行。下面代碼為本應(yīng)用所有的權(quán)限注冊(cè)代碼:123456789101112131415 usespermission android:name= / usespermission android:name= / usespermission android:name= / usespermission android:name= / usespermission android:name= / usespermission android:name= / usespermission android:name= / usespermission android:name= / usespermission android:name= / usespermission android:name= / usespermission android:name= / usespermission android:name= / usespermission android:name= / usespermission android:name= / usespermission android:name= /在本軟件中遠(yuǎn)程控制手機(jī)就是通過(guò)此短信廣播接收機(jī)制實(shí)現(xiàn)的。當(dāng)系統(tǒng)收到短信后會(huì)向需要接收廣播的應(yīng)用發(fā)送短信廣播,本應(yīng)用接收廣播后就可根據(jù)短信內(nèi)容做出相應(yīng)的動(dòng)作了。其服務(wù)程序流程圖如圖 所示。創(chuàng)建 S M S R e c e i v e dB r o a d c a s t R e c e i v e r 類繼承B r o a d c a s t R e c e i v e r 類覆寫 o n R e c e i v e方法判斷防盜保護(hù)是否已開啟得到數(shù)據(jù)庫(kù)數(shù)據(jù)N判斷是否為安全手機(jī)號(hào)碼判斷是否為定位指令NY判斷是否為鎖屏指令N判斷是否為報(bào)警指令判斷是否為銷毀數(shù)據(jù)指令NN獲取地址并向安全手機(jī)發(fā)送執(zhí)行手機(jī)鎖屏程序執(zhí)行手機(jī)發(fā)報(bào)警音程序備份并銷毀原有數(shù)據(jù)YYYY圖 SMS 服務(wù)流程圖短信接收后臺(tái)服務(wù)關(guān)鍵代碼解析如下:123456789101112131415//創(chuàng)建SMSReceivedBroadcastReceiver類繼承BroadcastReceiver類實(shí)現(xiàn)接收短信廣播public class SMSReceivedBroadcastReceiver extends BroadcastReceiver {//覆寫父類onReceive方法執(zhí)行動(dòng)作public void onReceive(Context context, Intent intent) {// 檢測(cè)防盜保護(hù)是否開啟if(isprotect) {//通過(guò)msgs[i].getDisplayOriginatingAddress()方法得到來(lái)源短信電話號(hào)碼//對(duì)比是否為安全手機(jī)號(hào)if(().equals(+86 + safenumber)){}else if(().equals(12520 + safenumber)){}else if(().equals(safenumber)) {}// if((dingwei + password)) {}// else if((suoding + password)){}1617181920// else if((baojing + password)){}// else if((xiaohui + password)){}} 換卡短信通知本應(yīng)用在開機(jī)完成后首先接收系統(tǒng)發(fā)出的開機(jī)完成廣播,這時(shí)軟件就會(huì)在后臺(tái)開始檢測(cè) SIM 卡的 IMSI 碼信息,如果此信息與原保存的 IMSI 碼不一致,則說(shuō)明手機(jī)處于非安全狀態(tài)。待手機(jī)檢測(cè)到信號(hào),可執(zhí)行移動(dòng)服務(wù)的時(shí)候,服務(wù)狀態(tài)廣播就會(huì)向手機(jī)所有應(yīng)用發(fā)送此廣播。當(dāng)本應(yīng)用接收到此廣播后就會(huì)立即向安全手機(jī)號(hào)發(fā)送 SIM 卡被更換的報(bào)告。其服務(wù)效果如圖 所示。開機(jī)完成 獲取信號(hào)服務(wù)A n d r o i d 手機(jī)系統(tǒng)發(fā)送廣播開機(jī)完成廣播 獲取信號(hào)服務(wù)廣播等待開機(jī)廣播和信號(hào)服務(wù)廣播全部接收NY 通過(guò) S M S 發(fā)送信息圖 開機(jī)檢測(cè) SIM 卡信息流程圖開機(jī)檢測(cè) SIM 卡程序主要代碼分析如下:123456//創(chuàng)建一個(gè)用于開機(jī)接收廣播的類BootCompleteReceiverpublic class BootCompleteReceiver extends BroadcastReceiver {//覆寫父類中的onReceive執(zhí)行動(dòng)作public void onReceive(Context context, Intent intent) {//判斷是否開啟防盜保護(hù)和換卡通知if(isprotect amp。amp。 issendID) {7891011121314151617181920//通過(guò)getSubscriberId()方法提取SIM卡IMSI號(hào)String IMSI = ()。//判斷是否與安全I(xiàn)MSI號(hào)相等if(().equals(safeIMSI)) {return。}//不等則后臺(tái)向安全手機(jī)號(hào)發(fā)送短信else {SmsManager manager = ()。ListString message = (手機(jī)IMSI碼為: + safeIMSI + 的手機(jī),SIM已被更換,更換的IMSI碼為: + IMSI)。for(String msg : message) {(safenumber, null, msg, null, null)。 定位手機(jī)Android 系統(tǒng)可通過(guò)手機(jī)的 GPS 模塊為我們提供當(dāng)前手機(jī)的位置信息既經(jīng)緯度。然后我們?cè)偻ㄟ^(guò)向服務(wù)器發(fā)送地址請(qǐng)求的方式得到手機(jī)的具體位置既街道等。其具體實(shí)現(xiàn)流程圖如圖 所示。通過(guò) o n L o c a t i o n C h a n g e d方法得到手機(jī)的經(jīng)緯度G P S 位置信息通過(guò)D e f a u l t H t t p C l i e n t ( ) . E x e c u t e ( )方法向指定 U R