林莉蕓 曾雪松
(信陽(yáng)職業(yè)技術(shù)學(xué)院 數(shù)學(xué)與計(jì)算機(jī)科學(xué)學(xué)院,河南 信陽(yáng) 464000)
?
Android中基于回調(diào)接口的確權(quán)機(jī)制
林莉蕓曾雪松
(信陽(yáng)職業(yè)技術(shù)學(xué)院 數(shù)學(xué)與計(jì)算機(jī)科學(xué)學(xué)院,河南 信陽(yáng) 464000)
對(duì)Android系統(tǒng)中的回調(diào)接口的確權(quán)機(jī)制做簡(jiǎn)要介紹,對(duì)基于回調(diào)接口的確權(quán)機(jī)制做深入討論,最后結(jié)合實(shí)際情況,給出Android應(yīng)用的開(kāi)發(fā)流程圖。
Android;回調(diào);接口;確權(quán)
不管是桌面應(yīng)用還是手機(jī)應(yīng)用程序,面對(duì)最多的就是用戶,經(jīng)常需要處理的就是用戶動(dòng)作,也就是需要為用戶的動(dòng)作提供響應(yīng)。這種為用戶動(dòng)作提供響應(yīng)的機(jī)制就是確權(quán)機(jī)制。隨著移動(dòng)互聯(lián)網(wǎng)的飛速發(fā)展,手機(jī)應(yīng)用越來(lái)越豐富,在應(yīng)用安裝運(yùn)行的同時(shí),它們就擁有了一些搜集手機(jī)數(shù)據(jù)的權(quán)限,在豐富我們生活的同時(shí),個(gè)人的隱私也隨之有可能遭到泄露。在不知不覺(jué)中,大量的應(yīng)用都在截取著我們?cè)诨ヂ?lián)網(wǎng)上的消費(fèi)信息和消費(fèi)習(xí)慣。那么如何避免個(gè)人的過(guò)多信息遭到泄露呢?從Android 4.4開(kāi)始引入了權(quán)限管理機(jī)制。
所謂權(quán)限管理,就是能夠手動(dòng)配置某個(gè)App的權(quán)限,進(jìn)而阻止惡意軟件以及防止隱私泄漏。當(dāng)然,更進(jìn)一步的權(quán)限管理,是能夠在App動(dòng)態(tài)使用某個(gè)權(quán)限的時(shí)候,提供一直通知機(jī)制提示用戶允許和拒絕。這樣的權(quán)限管理就更加類似于Windows中的主動(dòng)防御。
目前Android默認(rèn)的權(quán)限管理方法是:檢測(cè)應(yīng)用操作權(quán)限請(qǐng)求,構(gòu)造一個(gè)AlertDialog對(duì)象供用戶選擇。用戶有三種選擇:允許、拒絕和忽略。Android系統(tǒng)設(shè)備根據(jù)用戶的選擇來(lái)決定應(yīng)用此次操作的權(quán)限:要么允許此次操作,要么阻止此次操作,要么忽略。這種彈框機(jī)制不但與OS 5.0系統(tǒng)風(fēng)格不符,而且會(huì)造成多個(gè)AlertDialog堆積在一起,用戶要一個(gè)個(gè)自上而下地確權(quán),不能一目了然地看到系統(tǒng)當(dāng)前所有的權(quán)限申請(qǐng)。
在實(shí)際實(shí)訓(xùn)項(xiàng)目實(shí)現(xiàn)上采用了基于回調(diào)接口的新的確權(quán)機(jī)制,用自定義的view代替了系統(tǒng)采用的AlertDialog,新機(jī)制能大大改善用戶體驗(yàn),符合OS 5.0風(fēng)格。
回調(diào)就是當(dāng)主程序需要的時(shí)候(或者到預(yù)定義狀態(tài)值)調(diào)用的接口實(shí)現(xiàn)類。接口實(shí)際上是不能被直接調(diào)用的,我們能調(diào)用的一定不是接口或者抽象類。
回調(diào)接口的很多應(yīng)用場(chǎng)景是出現(xiàn)在以接口類型為參數(shù)的情況下,以匿名內(nèi)部類的方式傳入而達(dá)到。
例如,假設(shè)有一個(gè)Java的API方法叫作(其中的ClickEvent就是一個(gè)接口)public void addEventListener(ClickEvent evt),那么,你在調(diào)用的時(shí)候就可以這樣:
addEventListener(new ClickEvent(){
//在這里實(shí)現(xiàn)接口中的方法
});
當(dāng)發(fā)生某事件時(shí),API的addEventListener方法就會(huì)被組件調(diào)用,從而所完成的匿名內(nèi)部類代碼就會(huì)被組件執(zhí)行。
例如,客戶程序C調(diào)用服務(wù)程序S中的某個(gè)函數(shù)A,然后S又在某個(gè)時(shí)候反過(guò)來(lái)調(diào)用C中的某個(gè)函數(shù)B,對(duì)于C來(lái)說(shuō),這個(gè)B便叫做回調(diào)函數(shù)。像Win32下的窗口過(guò)程函數(shù)就是一個(gè)典型的回調(diào)函數(shù)。一般說(shuō)來(lái),C不會(huì)自己調(diào)用B,C提供B的目的就是讓S來(lái)調(diào)用它,而且是C不得不提供。由于S并不知道C提供的B姓甚名誰(shuí),所以S會(huì)約定B的接口規(guī)范(函數(shù)原型),然后由C提前通過(guò)S的一個(gè)函數(shù)R告訴S自己將要使用B函數(shù),這個(gè)過(guò)程稱為回調(diào)函數(shù)的注冊(cè),R稱為注冊(cè)函數(shù)。Web Service以及Java的RMI都用到回調(diào)機(jī)制,可以訪問(wèn)遠(yuǎn)程服務(wù)器程序。
當(dāng)應(yīng)用有權(quán)限請(qǐng)求時(shí),權(quán)限管理服務(wù)會(huì)通過(guò)Binder調(diào)用到SystemUI中注冊(cè)的回調(diào)接口,回調(diào)接口構(gòu)造一個(gè)自定義的view對(duì)象并呈現(xiàn)給用戶,用戶確權(quán)后通過(guò)Binder將確權(quán)結(jié)果傳給權(quán)限管理服務(wù)。權(quán)限管理服務(wù)進(jìn)而將結(jié)果返回給申請(qǐng)權(quán)限的客戶端,客戶端根據(jù)確權(quán)結(jié)果繼續(xù)以下的流程。
所有的權(quán)限請(qǐng)求以自定義的View顯示,自定義View以List的形式通過(guò)狀態(tài)欄彈出,能讓用戶一覽無(wú)余,隨意選擇對(duì)哪個(gè)請(qǐng)求操作作出回應(yīng)。而并非像在原生狀態(tài)下機(jī)械地按順序操作。
JAVA方法回調(diào)是功能定義和功能實(shí)現(xiàn)分享的一種手段,是一種耦合設(shè)計(jì)思想。作為一種架構(gòu),必須有自己的運(yùn)行環(huán)境,并且提供用戶的實(shí)現(xiàn)接口。
(1)定義接口 Callback,包含回調(diào)方法callback()
(2)在一個(gè)類Caller中聲明一個(gè)Callback接口對(duì)象mCallback
(3)在程序中賦予 Caller對(duì)象的接口成員(mCallback) 一個(gè)內(nèi)部類對(duì)象如
new Callback(){
callback(){
//函數(shù)的具體實(shí)現(xiàn)
}
}
這樣,在需要的時(shí)候,可用Caller對(duì)象的mCallback接口成員調(diào)用callback()方法,完成回調(diào)。
例如,Android設(shè)備構(gòu)造狀態(tài)欄PhoneStatusBar時(shí),實(shí)例化一個(gè)自定義的View對(duì)象PermissionsCheckPanelView,該對(duì)象代表著權(quán)限申請(qǐng)?zhí)崾究?。同時(shí)該View對(duì)象又是CheckPermissionCallback類的一個(gè)成員變量。
通過(guò)IOnCallbackAddRequest接口類將CheckPermissionCallback和AppOpsService連接起來(lái),當(dāng)有權(quán)限請(qǐng)求操作時(shí),AppOpsService的askOperationLocked方法被調(diào)用,在askOperationLocked方法中調(diào)用IOnCallbackAddRequest接口中的onAddRequest方法。進(jìn)而會(huì)調(diào)用到CheckPermissionCallback中的該方法,CheckPermissionCallback對(duì)該方法做了實(shí)現(xiàn)。實(shí)現(xiàn)的本質(zhì)就是發(fā)送消息MSG_CTRLALL_PERMISSION_CHECK_PANEL,在該消息的處理中構(gòu)造一個(gè)PermissionsCheckPanelView對(duì)象并顯示出來(lái)。該對(duì)象代表著權(quán)限申請(qǐng)?zhí)崾究颉ermissionsCheckPanelView對(duì)象已實(shí)現(xiàn)OnTouchListener和OnItemClickListener接口,可以響應(yīng)用戶的選擇操作。當(dāng)用戶作出選擇或者等待15秒后,SystemUI會(huì)通過(guò)Binder調(diào)用AppOpsService的pushRequestChoice方法。在該方法中將用戶的選擇結(jié)果做處理,如用戶選擇記住時(shí),需要將確權(quán)結(jié)果寫(xiě)進(jìn)appops.xml文件。最后將確權(quán)結(jié)果通過(guò)Binder傳回給申請(qǐng)權(quán)限的客戶端,客戶端根據(jù)結(jié)果繼續(xù)下面的流程。以下是確權(quán)流程詳細(xì)圖示。
Android應(yīng)用需要運(yùn)行在手機(jī)上,手機(jī)與傳統(tǒng)的計(jì)算機(jī)相比存儲(chǔ)能力、計(jì)算能力有限,因此Android應(yīng)用更適合作為客戶端軟件來(lái)使用。作為客戶端應(yīng)用程序,手機(jī)更能充分發(fā)揮它的攜帶方便的優(yōu)勢(shì),可以隨時(shí)隨地開(kāi)機(jī)運(yùn)行程序,而且可以隨時(shí)訪問(wèn)網(wǎng)絡(luò),通過(guò)網(wǎng)絡(luò)與服務(wù)器交互。
[1]董曉剛.Android中基于回調(diào)機(jī)制的事件處理[J].中國(guó)電子商務(wù),2013,(13).
[2]李楊.基于Android的多媒體應(yīng)用開(kāi)發(fā)與研究[J].計(jì)算機(jī)與現(xiàn)代化,2011,(4).
[3]韓超.基于Android經(jīng)典應(yīng)用開(kāi)發(fā)[M].北京:人力資源出版社,2011.
[4]劉平.Android手機(jī)訪問(wèn)服務(wù)器的一種數(shù)據(jù)交互方法[J].電子設(shè)計(jì)工程,2010,(9).
責(zé)任編輯:柴造坡
10.3969/j.issn.1674-6341.2016.04.015
2016-03-31
林莉蕓(1978—),女,河南駐馬店人,碩士,講師。研究方向:網(wǎng)絡(luò)與多媒體技術(shù)、軟件技術(shù)。
TP316
A
1674-6341(2016)04-0033-02