为安卓应用添加手势密码功能,遇到的一些问题以及解决方法
公司的APP有個需求為他添加類似于支付寶的手勢密碼驗(yàn)證功能效果圖如下
首先我們要分析三個問題:
1.手勢密碼的作用是什么?
2.在什么時候啟動?
3.啟動之后干什么?
1.手勢密碼的作用是什么?
這里很容易解答,為了APP二次啟動進(jìn)入進(jìn)行驗(yàn)證是否正常授權(quán)的用戶。
2.在什么時候啟動?
如果是對安全性比較高的應(yīng)用這里推薦應(yīng)用處于后臺運(yùn)行狀態(tài)下馬上進(jìn)入安全驗(yàn)證狀態(tài)(也就是需要輸入手勢密碼才能回到之前的Activity)
另一種安全性能要求是不那么高的用戶在鎖屏之后再次回到應(yīng)用啟動驗(yàn)證即可。
3.啟動之后干什么?
手勢驗(yàn)證成功就進(jìn)入打開APP,驗(yàn)證失敗就不讓動~
關(guān)于手勢驗(yàn)證代碼網(wǎng)上一大堆,我這里主要講解如何集成到我們的app中,畢竟在app開發(fā)中會用就行:orz
首先我們要獲取APP的狀態(tài)是否進(jìn)入后臺等,這里有幾種思路:
1.監(jiān)聽HOME鍵power鍵跟返回鍵操作
2.監(jiān)聽鎖屏解鎖廣播
3.自定義廣播實(shí)現(xiàn)監(jiān)聽
由于軟件需求的安全性不高,我選擇了第二種:監(jiān)聽解鎖廣播
android.intent.action.USER_PRESENT 用戶操作進(jìn)行解鎖時會觸發(fā)
我們首先編寫一個CustomReceiver代碼如下
然后在清單文件申明
<receiver android:name=".broadcast.CustomReceiver"><intent-filter><action android:name="android.intent.action.USER_PRESENT"/></intent-filter> </receiver>監(jiān)聽廣播并且判斷當(dāng)前手勢密碼是否存在,存在跳轉(zhuǎn)到驗(yàn)證Activity。注意這里的setFlags在廣播中啟動activity必須設(shè)置flag為FLAG_ACTIVITY_NEW_TASK
否則報錯如下
鎖屏后啟動驗(yàn)證解決了。現(xiàn)在的問題,啟動后干什么?兩種情況
1.APP未啟動過,處于非運(yùn)行狀態(tài),跳轉(zhuǎn)至啟動動畫即可
2.運(yùn)行時,恢復(fù)到原來的Activity
第一種情況直接啟動Intent的跳轉(zhuǎn)就好了
第二種情況怎么記錄處于棧頂?shù)腁ctivity?
我這里提供一個辦法在每個activity的onResume方法中添加當(dāng)前的Activity
當(dāng)手勢密碼驗(yàn)證通過取得最后一個activity的名字去啟動,代碼如下
//程序處于運(yùn)行狀態(tài)只要取出最后一個運(yùn)行的activity就好了if(activitys.size()!=0){lastactivityname = activitys.get(activitys.size()-1).getComponentName();Logger.e(activitys.size()+"");Intent intent = new Intent();intent.setComponent(lastactivityname);intent.setFlags(FLAG_ACTIVITY_CLEAR_TOP);//清除當(dāng)前activity,讓之前啟動的Activity處于棧頂startActivity(intent);}else {//程序此時沒有運(yùn)行啟動歡迎頁面即可Intent intent = new Intent(this,ShowFirstActivity.class);startActivity(intent);}注意這里的FLAG_ACTIVITY_CLEAR_TOP
這里貼上Intent 的常見Flag
先首先簡單介紹下Task和Activity的關(guān)系
Task就像一個容器,而Activity就相當(dāng)與填充這個容器的東西,第一個東西(Activity)則會處于最下面,最后添加的東西(Activity)則會在最上面。從Task中取出東西(Activity)是從最頂端取出,也就是說最先取出的是最后添加的東西(Activity),以此類推,最后取出的是第一次添加的Activity,而Activity在Task中的順序是可以控制的,在Activity跳轉(zhuǎn)時用到Intent Flag可以設(shè)置新建activity的創(chuàng)建方式;
FLAG_ACTIVITY_NEW_TASK
默認(rèn)的跳轉(zhuǎn)類型,它會重新創(chuàng)建一個新的Activity,不過與這種情況,比如說Task1中有A,B,C三個Activity,此時在C中啟動D的話,如果在AndroidManifest.xml文件中給D添加了Affinity的值和Task中的不一樣的話,則會在新標(biāo)記的Affinity所存在的Task中壓入這個Activity。如果是默認(rèn)的或者指定的Affinity和Task一樣的話,就和標(biāo)準(zhǔn)模式一樣了啟動一個新的Activity.
FLAG_ACTIVITY_SINGLE_TOP
這個FLAG就相當(dāng)于加載模式中的singletop,比如說原來?xiàng)V星闆r是A,B,C,D在D中啟動D,棧中的情況還是A,B,C,D
FLAG_ACTIVITY_CLEAR_TOP
這個FLAG就相當(dāng)于加載模式中的SingleTask,這種FLAG啟動的Activity會把要啟動的Activity之上的Activity全部彈出棧空間。類如:原來?xiàng)V械那闆r是A,B,C,D這個時候從D中跳轉(zhuǎn)到B,這個時候棧中的情況就是A,B了
FLAG_ACTIVITY_BROUGHT_TO_FRONT
這個網(wǎng)上很多人是這樣寫的。如果activity在task存在,拿到最頂端,不會啟動新的Activity。這個有可能會誤導(dǎo)大家! 他這個FLAG其實(shí)是這個意思!比如說我現(xiàn)在有A,在A中啟動B,此時在A中Intent中加上這個標(biāo)記。此時B就是以FLAG_ACTIVITY_BROUGHT_TO_FRONT方式啟動,此時在B中再啟動C,D(正常啟動C,D),如果這個時候在D中再啟動B,這個時候最后的棧的情況是 A,C,D,B。如果在A,B,C,D正常啟動的話,不管B有沒有用FLAG_ACTIVITY_BROUGHT_TO_FRONT啟動,此時在D中啟動B的話,還是會變成A,C,D,B的。
FLAG_ACTIVITY_NO_USER_ACTION
onUserLeaveHint()作為activity周期的一部分,它在activity因?yàn)橛脩粢D(zhuǎn)到別的activity而要退到background時使用。比如,在用戶按下Home鍵,它將被調(diào)用。比如有電話進(jìn)來(不屬于用戶的選擇),它就不會被調(diào)用。
那么系統(tǒng)如何區(qū)分讓當(dāng)前activity退到background時使用是用戶的選擇?
它是根據(jù)促使當(dāng)前activity退到background的那個新啟動的Activity的Intent里是否有FLAG_ACTIVITY_NO_USER_ACTION來確定的。
注意:調(diào)用finish()使該activity銷毀時不會調(diào)用該函數(shù)
FLAG_ACTIVITY_NO_HISTORY
意思就是說用這個FLAG啟動的Activity,一旦退出,它不會存在于棧中,比方說!原來是A,B,C這個時候再C中以這個FLAG啟動D的,D再啟動E,這個時候棧中情況為A,B,C,E。
至此為應(yīng)用添加手勢密碼功能的邏輯就完成了。歡迎留言更好的方法。
總結(jié)
以上是生活随笔為你收集整理的为安卓应用添加手势密码功能,遇到的一些问题以及解决方法的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: ListView嵌套RecyclerVi
- 下一篇: 安卓禁止ScrollView内的控件改变