官术网_书友最值得收藏!

2.5 設(shè)置向?qū)Чδ?/a>

設(shè)置向?qū)е饕糜谡故臼謾C防盜模塊,以及綁定SIM卡、設(shè)置安全號碼、開啟防盜保護功能等,本節(jié)將針對設(shè)置向?qū)Чδ苓M行詳細講解。

2.5.1 滑屏動畫

在Android系統(tǒng)中,通過手勢識別切換界面時,通常會在界面切換時加入動畫,以提高用戶的體驗效果,這種動畫一般都采用平移動畫,當(dāng)下一個界面進入時,上一個界面移出屏幕,如圖2-14所示。

圖2-14 動畫效果圖

從圖2-14可以看出,屏幕左上角的坐標(biāo)為(0,0),進入屏幕的界面坐標(biāo)為(100%p,0),從屏幕切出界面的坐標(biāo)為(-100%p,0)。需要注意的是,p是指屏幕,100%p表示整個屏幕,切入界面和切出界面都是以整個屏幕為單位計算的。

界面切換的平移動畫有四個,分別是下一個界面進入與切出效果,以及上一個界面進入與切出效果,接下來分別定義這四個動畫文件。

1.下一個界面進入、切出動畫

在res目錄中添加一個anim文件夾,在該文件夾中定義下一個界面進入的動畫效果(next_in.xml),具體代碼如【文件2-23】所示。

【文件2-23】res/anim/next_in.xml

上述代碼中,android:fromXDelta="100%p",android:toXDelta="0"屬性表示當(dāng)前界面從X軸坐標(biāo)100%p移動到0,android:duration="500"表示動畫執(zhí)行時長為500毫秒,repeatCount="0"表示動畫不重復(fù)執(zhí)行。

在anim文件夾下創(chuàng)建下一個界面切出的動畫效果(next_out.xml),具體代碼如【文件2-24】所示。

【文件2-24】res/anim/next_out.xml

下一個界面進入效果與切出效果代碼類似,只不過當(dāng)前界面是從X軸坐標(biāo)0位置移動到-100%p,時長為0.5秒,動畫不重復(fù)執(zhí)行。

2.上一個界面進入、切出動畫

上一個界面的進入、切出動畫與上面的代碼非常類似,只不過是X軸坐標(biāo)的起始位置與結(jié)束位置的變化而已。下面在anim文件夾下創(chuàng)建上一個界面進入的動畫效果(pre_in.xml),具體代碼如【文件2-25】所示。

【文件2-25】res/anim/pre_in.xml

在anim文件夾下創(chuàng)建上一個界面切出的動畫效果(pre_in.xml),具體代碼如【文件2-26】所示。

【文件2-26】res/anim/pre_out.xml

至此,所有的動畫效果已經(jīng)創(chuàng)建完成,只需在切換屏幕時引入即可。

2.5.2 手勢滑動

設(shè)置向?qū)е凶詈诵牡膬?nèi)容就是通過手勢識別切換界面,當(dāng)手指落在手機屏幕上按住屏幕快速滑動屏幕即可切換。為了更生動形象地展示切換效果,通過一個圖例進行展示,具體如圖2-15所示。

圖2-15 屏幕切換效果圖

從圖2-15可以看出,當(dāng)手指在左側(cè)按下向右快速滑動時,上一屏進入當(dāng)前界面,當(dāng)手指在右側(cè)按下快速向左側(cè)滑動時,下一屏進入當(dāng)前界面。需要注意的是,在滑動過程中需要過濾一些無效的動作(如滑動太慢)。

從功能介紹中可知,設(shè)置向?qū)У拿恳粋€界面都需要進行滑動,也就是說每個Activity都要有手勢識別器。為了避免代碼的重復(fù)編寫,可以定義一個父類實現(xiàn)手勢識別功能,其他類繼承該類即可。設(shè)置向?qū)Ы缑娴母割惾纭疚募?-27】所示。

【文件2-27】BaseSetUpActivity.java

代碼說明:

●第10~37行代碼用于初始化手勢識別器,并實現(xiàn)onFling()方法,在該方法中通過if語句對手勢的滑動效果進行判斷,如果if(Math.abs(velocityX)<200)時表示1秒移動小于200像素,移動速度太慢界面不切換;如果if((e2.getRawX()-e1.getRawX())>200)時,則從左向右滑動屏幕顯示上一個界面并顯示動畫效果;如果if((e1.getRawX()-e2.getRawX())> 200)時,則從右向左滑動屏幕,顯示下一個界面并顯示動畫效果。

●第38~39行代碼定義了一個showNext()方法和一個showPre()方法,分別用于展示下一個頁面和上一個頁面。這兩個方法都是抽象的,需要子類重寫。

●第42~46行重寫了onTouchEvent()方法,并通過手勢識別器分析屏幕上的手勢事件。

●第51~55行的startActivityAndFinishSelf(Class<?> cls)方法用于在當(dāng)前界面開啟一個新的Activity時,把當(dāng)前的Activity關(guān)閉,其中傳入的參數(shù)Class<?> cls可以是一個Activity。

2.5.3 向?qū)Чδ埽ㄒ唬?/a>

當(dāng)父類創(chuàng)建好之后接下來實現(xiàn)設(shè)置向?qū)У谝粋€界面的邏輯,由于第一個界面只是單純的用于展示,因此邏輯較為簡單,具體代碼如【文件2-28】所示。

【文件2-28】SetUp1Activity.java

代碼說明:

●第8~11行的initView()方法用于初始化控件,將界面小圓點的狀態(tài)置為選中狀態(tài),此時小圓點的顏色為紫色。

●第13~15行的showNext()方法重寫了BaseSetUpActivity中的showNext()方法,用于開啟SetUp2Activity并關(guān)閉當(dāng)前Activity。

●第17~19行showPre()方法重寫了BaseSetUpActivity中的showPre()方法,當(dāng)手指在屏幕上從左向右滑動時用于彈出提示信息,說明當(dāng)前頁面是第一頁不能顯示前一頁。

2.5.4 向?qū)Чδ埽ǘ?/a>

設(shè)置向?qū)У诙€界面主要用于綁定SIM卡,相比第一個界面來說邏輯較為復(fù)雜,具體代碼如【文件2-29】所示。

【文件2-29】SetUp2Activity.java

代碼說明:

●第12~22行的initView()方法用于初始化控件,指定第2個小圓點被選中,并判斷SIM卡是否綁定,如果已綁定則將該Button按鈕設(shè)置為不可用。

●第54~67行的bindSIM()方法用于綁定SIM卡,通過if語句判斷如果當(dāng)前SIM卡沒有綁定,則獲取手機的SIM卡串號,并存入SharedPreferences對象中,如果綁定了則彈出Toast進行,并將按鈕設(shè)置為不可用。

在檢測SIM卡是否發(fā)生變化時,可以使用Application類。該類是Android框架的一個系統(tǒng)組件,當(dāng)Android程序啟動時系統(tǒng)會創(chuàng)建Application對象(單例模式的一個類,需要在application標(biāo)簽增加name屬性,并添加Application名字即可)。正是由于它的這種特性,可以將檢測SIM卡是否變更的方法放在Application的onCreate()方法中,當(dāng)程序啟動時就會檢測SIM卡是否變更。接下來創(chuàng)建一個Application子類App,具體代碼如【文件2-30】所示。

【文件2-30】App.java

代碼說明:

●第9~12行代碼用于獲取當(dāng)前手機防盜保護的狀態(tài)。

●第13~33行代碼用于判斷手機SIM卡是否更換,當(dāng)防盜保護開啟時,獲取綁定的SIM卡串號,然后獲取當(dāng)前手機SIM卡串號進行比對,如果一致則代表SIM卡未發(fā)生變化,如果不一致則代表SIM卡發(fā)生變化,此時需要向安全號碼發(fā)送短信,提示手機SIM卡已更換。

多學(xué)一招:Application類

Application和Activity、Service一樣是Android框架的一個系統(tǒng)組件,當(dāng)Android程序啟動時系統(tǒng)會創(chuàng)建一個Application對象(只創(chuàng)建一個,所以Application可以說是單例模式的一個類),用來存儲系統(tǒng)的一些信息,如全局變量,全局變量相對靜態(tài)類更有保障,直到應(yīng)用的所有Activity全部被銷毀之后才會被釋放。

通常情況下Application是不需要手動指定的,系統(tǒng)會自動創(chuàng)建。如果需要自己創(chuàng)建Application,也很簡單,只需創(chuàng)建一個類繼承Application,并在AndroidManifest.xml文件中的application標(biāo)簽進行注冊即可(只需要給application標(biāo)簽增加name屬性,并添加自己的Application名字)。

當(dāng)Application啟動時,系統(tǒng)會創(chuàng)建一個PID,即進程ID,所有的Activity都會在此進程上運行。也就是說,當(dāng)Application創(chuàng)建時會初始化全局變量,同一個應(yīng)用的所有Activity都可以取得這些全局變量的值,換句話說,在某一個Activity中改變了這些全局變量的值,那么在同一個應(yīng)用的其他Activity中值也會改變。

Application對象的生命周期是整個程序中最長的,它的生命周期就等于整個程序的生命周期。由于它是全局的單例的,在不同的Activity、Service中獲得的對象都是同一個對象,因此可以通過Application來進行一些數(shù)據(jù)傳遞、數(shù)據(jù)共享和數(shù)據(jù)緩存等操作。

在Android系統(tǒng)中,有些手機SIM卡更換后,需要重新啟動手機識別新的SIM卡,因此,為了最大限度地知道SIM卡變化,還需要創(chuàng)建一個開機啟動的廣播接收者,監(jiān)聽手機開機事件,并調(diào)用App中的correctSIM()方法判斷SIM卡是否變更,開機啟動的廣播接收者如【文件2-31】所示。

【文件2-31】BootCompleteReciever.java

在AndroidManifest.xml文件中,注冊開機啟動的廣播接收者以及配置權(quán)限信息,具體代碼如下所示:

2.5.5 向?qū)Чδ埽ㄈ?/a>

設(shè)置向?qū)У谌齻€界面用于選擇或輸入安全聯(lián)系人,當(dāng)手機SIM卡變更后會向安全號碼發(fā)送短信通知,具體如【文件2-32】所示。

【文件2-32】SetUp3Activity.java

代碼說明:

●第13~21行的initView()方法用于初始化控件,指定第三個小圓點被選中,并判斷是否指定過安全號碼,如果指定過則會顯示在當(dāng)前文本編輯框中。

●第23~34行的showNext()方法用于判斷文件編輯框中是否有輸入了安全號碼,如果沒有則彈出提示讓用戶輸入號碼,否則將號碼保存在SharedPreferences對象中,然后開啟SetUp4Activity進入下一個界面,并關(guān)閉當(dāng)前Activity。

●第40~46行的onClick()方法用于響應(yīng)按鈕的點擊事件,當(dāng)點擊添加聯(lián)系人按鈕時,會跳轉(zhuǎn)到ContactSelectActivity中選擇要添加的安全號碼(查詢聯(lián)系人功能會在下一小節(jié)實現(xiàn))。

●第48~55行的onActivityResult()方法用于接收聯(lián)系人界面中選中的聯(lián)系人信息,并將聯(lián)系人號碼展示到安全號碼中。

2.5.6 獲取聯(lián)系人

在設(shè)置向?qū)У谌齻€界面中,當(dāng)點擊“添加聯(lián)系人”按鈕時,需要跳轉(zhuǎn)到聯(lián)系人列表界面。獲取聯(lián)系人功能相對來說比較獨立,因此將其作為一個單獨小節(jié)進行講解。

1.聯(lián)系人列表UI

由于聯(lián)系人信息是以條目依次展示的,因此,在界面中可以使用ListView控件,聯(lián)系人列表的圖形化界面如圖2-16所示。

圖2-16所示聯(lián)系人列表界面對應(yīng)的布局文件如【文件2-33】所示。

【文件2-33】activity_contact_select.xml

上述布局文件中,引入了一個titlebar.xml布局,該布局是一個標(biāo)題欄,用于展示“選擇聯(lián)系人”的標(biāo)題,以及在左側(cè)放置一個返回按鈕,當(dāng)點擊返回按鈕時返回到設(shè)置向?qū)У谌齻€界面。

下面開發(fā)聯(lián)系人列表的Item布局,用于填充activity_contact_select.xml布局,Item布局的圖形化界面如圖2-17所示。

圖2-17中Item對應(yīng)的布局文件如【文件2-34】所示。

圖2-16 聯(lián)系人

圖2-17 Item布局

【文件2-34】item_list_contact_select.xml

上述布局文件中,定義了一個View控件以及兩個TextView控件,其中View控件用于顯示聯(lián)系人圖標(biāo),TextView控件分別用于顯示聯(lián)系人姓名、電話號碼。

2.聯(lián)系人的實體類

接下來開發(fā)一個ContactInfo類,該類用于封裝聯(lián)系人信息,如姓名、手機號碼等,具體代碼如【文件2-35】所示。

【文件2-35】ContactInfo.java

3.解析聯(lián)系人

聯(lián)系人信息都存儲在SQLite數(shù)據(jù)庫中,因此需要先獲取到聯(lián)系人的id,根據(jù)id在data表中查詢聯(lián)系人名字以及電話號碼,并封裝到ContactInfo中,然后存入List集合,具體代碼如【文件2-36】所示。

【文件2-36】ContactInfoParser.java

4.數(shù)據(jù)適配器

從數(shù)據(jù)庫查詢出的聯(lián)系人信息,需要通過數(shù)據(jù)適配器填充到ListView中,接下來定義聯(lián)系人列表的數(shù)據(jù)適配器ContactAdapter,具體代碼如【文件2-37】所示。

【文件2-37】ContactAdapter.java

多學(xué)一招:ListView優(yōu)化

在使用ListView控件的過程中,由于加載條目過多在滑動時可能造成卡頓。這是因為ListView在當(dāng)前屏幕顯示多少個條目,就會創(chuàng)建多少個對象,每一個條目都是一個對象。在滑動時,滑出屏幕的條目對象會被銷毀,新加載到屏幕上的條目會創(chuàng)建新的對象,這樣在ListView快速滑動時就會不斷地創(chuàng)建對象→銷毀對象→創(chuàng)建對象,并且每一個條目都需要加載一次布局,加載布局時會不斷進行findViewById()操作初始化控件,而布局XML文件是以樹形結(jié)構(gòu)進行加載,每次加載一個條目都需要從根節(jié)點進行初始化,這樣對內(nèi)存消耗也比較大,并且浪費時間。如果每個條目都有圖片,圖片加載的時間比較長,就會造成內(nèi)存溢出異常。為此就需要對ListView進行優(yōu)化,優(yōu)化的目的是在滑動時不會重復(fù)創(chuàng)建對象,減少內(nèi)存消耗和屏幕渲染處理。具體步驟如下:

(1)創(chuàng)建靜態(tài)類

創(chuàng)建一個靜態(tài)類,將需要加載的控件變量放在該靜態(tài)類中,保證所有控件只創(chuàng)建一次對象,不會重復(fù)創(chuàng)建對象,具體代碼如下:

(2)復(fù)用緩存View對象

在Adapter的getView(int position,View convertView,ViewGroup parent)方法中,第二個參數(shù)convertView代表的就是之前滑出屏幕的條目對象。如果是第一次加載該方法,會創(chuàng)建新的View對象,如果滑動ListView,滑動出屏幕的View對象會以緩存的形式存在,而convertView就是緩存的View對象,可以復(fù)用緩存該對象減少新對象的創(chuàng)建。在加載布局時先判斷convertView是否存在,如果convertView==null說明沒有緩存的View對象,則使用View.inflate()方法加載布局,進行布局的初始化,否則復(fù)用緩存的View對象,具體代碼如下:

多學(xué)一招:ListView優(yōu)化

需要注意的是,通常情況下getView()方法中最后的返回值都是View,但如果復(fù)用了convertView,最后的返回值一定要改為convertView,這樣才會將布局顯示到頁面中。

至此ListView的優(yōu)化已經(jīng)完成,通過以上幾個步驟便可保證ListView滑動時,無論有多少個條目或者滑動速度多快,ListView只會創(chuàng)建一屏的條目對象,不會創(chuàng)建多余對象,對滑動的流暢度和內(nèi)存占用都進行了優(yōu)化。在進行項目開發(fā)中,都會采用該方法對ListView進行優(yōu)化。

5.聯(lián)系人Activity

獲取聯(lián)系人所需的文件都已開發(fā)完成,接下來在ContactSelectActivity類中將數(shù)據(jù)填充到界面中即可,具體代碼如【文件2-38】所示。

【文件2-38】ContactSelectActivity.java

代碼說明:

●第25~54行的initView()方法用于初始化控件,并注冊ListView的條目點擊事件,然后通過Adapter將聯(lián)系人信息添加到界面中。

●第56~62行的onClick()方法用于響應(yīng)返回按鈕的點擊事件,當(dāng)點擊該按鈕時關(guān)閉當(dāng)前窗口。

2.5.7 向?qū)Чδ埽ㄋ模?/a>

設(shè)置向?qū)У谒膫€界面用于展示設(shè)置完成界面,并默認開啟防盜保護功能(可以手動關(guān)閉防盜保護),具體代碼如【文件2-39】所示。

【文件2-39】SetUp4Activity.java

代碼說明:

●第10~38行的initView()方法用于初始化控件,設(shè)置第四個小圓點被選中,并為ToggleButton按鈕注冊onCheckedChanged事件,當(dāng)按鈕為被選中狀態(tài)時,顯示“防盜保護已經(jīng)開啟”,反之則顯示“防盜保護沒有開啟”,然后將按鈕的狀態(tài)存儲到SharedPreferences對象中。其中第27~34行代碼用于判斷防盜保護是否開啟,如果已經(jīng)開啟則將按鈕設(shè)置為被選中狀態(tài),否則將按鈕設(shè)置為未被選中狀態(tài)。

●第40~46行的showNext()方法用于將設(shè)置過向?qū)У臓顟B(tài)存儲到SharedPreferences中,然后關(guān)閉當(dāng)前界面并跳轉(zhuǎn)到LostFindActivity類中。

●第48~50行的showPre()方法用于將顯示上一個界面,并關(guān)閉當(dāng)前界面。

2.5.8 防盜指令

防盜指令界面可以控制防盜保護功能的開啟和關(guān)閉、重新進入設(shè)置向?qū)Ы缑妫约罢故井?dāng)前可通過哪些指令來遠程操控手機,具體代碼如【文件2-40】所示。

【文件2-40】LostFindActivity.java

代碼說明:

●第18~20行的isSetUp()方法用于獲取SharedPreferences存入的isSetUp是否為true,用來判斷是否設(shè)置過向?qū)А?/p>

●第37~44行代碼用于查詢手機防盜是否開啟(默認狀態(tài)為開啟),如果已經(jīng)開啟,則將文字展示為“防盜保護已經(jīng)開啟”,并將ToggleButton按鈕設(shè)置為true;如果沒有開啟,則將文字展示為“防盜保護沒有開啟”,并將ToggleButton按鈕設(shè)置為false。

●第45~60行代碼是為ToggleButton按鈕注冊狀態(tài)改變的監(jiān)聽事件,當(dāng)按鈕被選中時,則當(dāng)前文字顯示“防盜保護已經(jīng)開啟”,否則顯示“防盜保護沒有開啟”,最后將防盜保護狀態(tài)是否開啟存入SharedPreferences對象中。

●第62~73行的onClick()方法用于響應(yīng)“重新進入設(shè)置向?qū)А卑粹o以及標(biāo)題欄返回按鈕的點擊事件,當(dāng)點擊重新進入設(shè)置向?qū)О粹o時,進入設(shè)置向?qū)У谝粋€界面,當(dāng)點擊返回按鈕時,則關(guān)閉當(dāng)前Activity,返回主界面。

●第74~78行的startSetUp1Activity()方法用于跳轉(zhuǎn)到SetUp1Activity界面重新進入設(shè)置向?qū)В㈥P(guān)閉當(dāng)前界面。

為了監(jiān)聽安全號碼發(fā)送的防盜指令,需要創(chuàng)建一個廣播接收者,根據(jù)收到的防盜指令來執(zhí)行不同的操作,具體代碼如【文件2-41】所示。

【文件2-41】SmsLostFindReciver.java

代碼說明:

●第6~8行代碼用于獲取SharedPreferences對象中存入的key為protecting(表示防盜保護是否開啟)的值,如果開啟則執(zhí)行if語句中的操作。

●第11~12行代碼用于獲取超級管理員權(quán)限,只有超級管理員才能完成遠程清除數(shù)據(jù)和遠程鎖屏功能,超級管理員權(quán)限需要在清單文件中配置。

●第13~17行代碼用于遍歷數(shù)據(jù)庫中的短信,獲取發(fā)件人以及發(fā)送的短信內(nèi)容。

●第18~44行代碼用于獲取安全聯(lián)系人的號碼,并判斷發(fā)送短信的號碼中是否有安全聯(lián)系人發(fā)送的,如果有則執(zhí)行下面的if語句,分別根據(jù)發(fā)送的防盜指令返回位置信息、播放報警音樂、遠程清除數(shù)據(jù)、遠程鎖屏功能。其中第35行清除數(shù)據(jù)代碼和第40行鎖屏代碼是必須要有超級管理員權(quán)限的,并且當(dāng)調(diào)用這段代碼時,必須開啟超級管理員權(quán)限,否則系統(tǒng)會崩潰。

值得一提的是,開啟超級管理員權(quán)限有兩種方式,一種是手動開啟,另一種是通過代碼開啟。手動開啟相對來說比較簡單,通過“設(shè)置”→“安全”→“設(shè)備管理器”選中手機安全衛(wèi)士項目即可。代碼開啟相對比較麻煩,不過在程序開發(fā)中大部分都是通過代碼開啟超級管理員權(quán)限。

在Android系統(tǒng)中,為了信息安全,普通用戶是無法隨意刪除系統(tǒng)中數(shù)據(jù)的,因此在執(zhí)行遠程鎖屏和刪除數(shù)據(jù)時,需要獲得超級管理員權(quán)限,接下來定義一個超級管理員的廣播接收者,具體代碼如【文件2-42】所示。

【文件2-42】MyDeviceAdminReciever.java

在AndroidManifest.xml文件中,注冊超級管理員的廣播接收者,具體代碼如【文件2-43】所示。

【文件2-43】AndroidManifest.xml

上述代碼中,定義了一個描述信息description以及l(fā)abel,這些信息是放置在strings.xml文件中的,還添加了一個權(quán)限android:permission="android.permission.BIND_DEVICE_ADMIN",用于指定綁定超級管理員的權(quán)限。

<meta-data>標(biāo)簽表示超級管理員的元數(shù)據(jù),其中的resource屬性表示資源,用于指定安全策略,在此將安全策略放置在device_admin_sample.xml文件中,具體代碼如【文件2-44】所示。

【文件2-44】res/xml/device_admin_sample.xml

下面創(chuàng)建防盜指令中使用的定位服務(wù)(GPSLocationService),該服務(wù)用于獲取手機的經(jīng)度、緯度、移動速度、精確度等,具體代碼如【文件2-45】所示。

【文件2-45】GPSLocationService.java

代碼說明:

●第10~22行的onCreate()方法用于位置提供者,首先獲取系統(tǒng)的位置管理器,然后通過Criteria對象返回可用的位置提供者,通過lm.getBestProvider(criteria,true)獲取最好的位置提供者,最后通過lm.requestLocationUpdates(name,0,0,listener)使用位置提供者。

●第23~50行定義了一個位置監(jiān)聽器MyListener,并實現(xiàn)了位置變化的四個方法,其中onLocationChanged()方法是當(dāng)手機位置發(fā)生變化時調(diào)用,因此可以在該方法中獲取手機的精確度、移動速度、緯度、經(jīng)度,然后拼接成一個字符串發(fā)送給安全號碼。onStatusChanged()方法表示當(dāng)前位置提供者位置發(fā)生變化時調(diào)用。onProviderEnabled()方法表示當(dāng)前位置提供者可用的時候調(diào)用,onProviderDisabled()方法表示當(dāng)前位置提供者不可用時調(diào)用。

●第52~56行onDestroy()方法用于注銷當(dāng)前的位置監(jiān)聽器。接下來在AndroidManifest.xml文件中注冊GPSLocationService服務(wù),具體代碼如下所示:

2.5.9 修改HomeActivity文件

手機防盜模塊代碼已編寫完成,接下來需要在HomeActivity中進行調(diào)用,在調(diào)用該模塊代碼時,首先需要調(diào)用設(shè)置密碼對話框代碼,在這段代碼中判斷兩次輸入的密碼是否一致,是否設(shè)置過密碼等,如果設(shè)置過密碼則調(diào)用輸入密碼對話框代碼,判斷密碼是否正確,具體代碼如【文件2-46】所示。

【文件2-46】HomeActivity.java

代碼說明:

●第22~64行代碼用于響應(yīng)GridView條目的點擊事件,當(dāng)點擊第一個功能圖標(biāo)時,也就是switch語句中的case等于0時,會進入手機防盜功能模塊。點擊其他的圖標(biāo)會進入相應(yīng)模塊,在此將其跳轉(zhuǎn)代碼全部實現(xiàn)。

●第66~78行代碼用于獲取設(shè)備的超級管理員權(quán)限,首先得到PolicyManager對象,然后通過該對象申請超級管理員權(quán)限。在程序啟動時這段代碼就會執(zhí)行,方便后期通過管理員權(quán)限鎖屏以及清除數(shù)據(jù)。

●第83~117行的showSetUpPswdDialog()方法用于彈出設(shè)置密碼對話框,首先在setUpPasswordDialog.setCallBack()回調(diào)方法中創(chuàng)建SetUpPasswordDialog.MyCallBack(){}對象,實現(xiàn)該回調(diào)接口中的ok()方法及cancle()方法,并通過if語句判斷兩次輸入的密碼是否一致。

●第121~149行的showInterPswdDialog()方法用于彈出輸入密碼對話框,同樣在mInPswdDialog.setCallBack()方法中創(chuàng)建InterPasswordDialog.MyCallBack(){}對象,實現(xiàn)confirm()方法以及cancle()方法,當(dāng)點擊“確定”按鈕時判斷輸入的密碼是否正確,當(dāng)點擊“取消”按鈕時關(guān)閉對話框。

●第154~159行的savePswd()方法用于將加密過的密碼保存到SharedPreferences對象中。

●第164~171行的getPassword()方法用于從SharedPreferences對象中獲取保存的密碼。

●第173~179行的isSetUpPassword()方法用于判斷用戶是否設(shè)置過手機防盜密碼。

主站蜘蛛池模板: 彭山县| 永城市| 乐昌市| 田阳县| 恩平市| 隆尧县| 松江区| 天柱县| 射洪县| 青州市| 刚察县| 沭阳县| 阿拉尔市| 杭锦旗| 杭锦后旗| 资溪县| 鹤山市| 谷城县| 金阳县| 梁河县| 鸡泽县| 乐安县| 双峰县| 淅川县| 阳春市| 洛南县| 吴江市| 柘荣县| 北川| 福贡县| 循化| 太和县| 禹州市| 裕民县| 瑞丽市| 从江县| 于田县| 大冶市| 渑池县| 时尚| 巴彦淖尔市|