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