日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

为安卓应用添加手势密码功能,遇到的一些问题以及解决方法

發(fā)布時間:2025/4/5 编程问答 24 豆豆
生活随笔 收集整理的這篇文章主要介紹了 为安卓应用添加手势密码功能,遇到的一些问题以及解决方法 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

公司的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代碼如下

public class CustomReceiver extends BroadcastReceiver {@Overridepublic void onReceive(Context context, Intent intent) {if (intent.getAction().equals("android.intent.action.USER_PRESENT") && SPUtils.getGestureCode(context) == HAS_GESTURE) {Logger.e("存在鎖屏密碼");SPUtils.put(context, "isLock", true);Intent intent1 = new Intent(context, SignUserGestureActivity.class);intent1.setFlags(FLAG_ACTIVITY_NEW_TASK);context.startActivity(intent1);} else {Logger.e("不存在鎖屏密碼" + SPUtils.getGestureCode(context));SPUtils.put(context, "isLock", false);} }

然后在清單文件申明

<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
否則報錯如下

Caused by: android.util.AndroidRuntimeException: Calling startActivity() from outside of an Activity context requires the FLAG_ACTIVITY_NEW_TASK flag. Is this really what you want?

鎖屏后啟動驗(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

//全局靜態(tài)集合保留所有的activitypublic static List<Activity> activitys=new ArrayList<>();

當(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)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: av影片在线 | 动漫美女隐私无遮挡 | 五月婷婷av| 日本三级视频网站 | 色干网 | 一区二区视频免费在线观看 | 麻豆视频一区二区三区 | 亚洲高潮| 久久精品无码一区 | 免费看日韩av | 日本三级片在线观看 | 欧美黄色大片免费看 | 一级片麻豆 | 中文字幕在线观看日本 | 亚洲欧美一区二区三区四区五区 | 五月天中文字幕 | 国产一区二区三区视频网站 | 看片在线 | 亚洲50p | 久久九九免费 | av短片| 日本高清黄色 | 久久精品一区二区国产 | 成年人看的黄色 | 免费成人在线播放 | 97人人在线 | 亚洲精品久久久中文字幕痴女 | 欧美肉大捧一进一出免费视频 | 国产成人在线观看 | 黄色在线网 | 荷兰av| 999综合网 | 麻豆传媒网站在线观看 | 欧美色图五月天 | 中出在线播放 | 亚洲久热| 国产男女爽爽爽 | 超碰97免费 | 国产精品字幕 | 依人成人综合网 | 91在线免费视频观看 | 性史性农村dvd毛片 日韩精品在线视频观看 | 色偷偷888欧美精品久久久 | 少妇高潮一区二区三区99欧美 | 精品成人无码一区二区三区 | 一二区精品 | 乱岳| 日本一二三不卡 | 国产乱人视频 | 精品无码久久久久久久久 | 亚洲一区二区三区电影 | 琪琪射| 天天舔天天爱 | 国产一级性生活片 | 激情视频91 | 国产黄片一区二区三区 | 成人欧美一区二区三区在线播放 | 久久国产精品久久久 | 欧美性猛交bbbbb精品 | 久久爱综合 | 黄色你懂的 | 狠狠干影院 | 久久久久久久久蜜桃 | 最新视频 - x88av | 国产午夜影院 | 四季av中文字幕一区 | 亚洲综合五月天婷婷丁香 | 暴操白虎| 日韩av一区二区在线播放 | 欧美综合一区 | 日本一级一片免费视频 | 黄av资源 | 久久综合爱 | 精品久久久久国产 | 国产精品精东影业 | 亚洲制服丝袜诱惑 | 中文字幕av播放 | 尤物在线精品 | 亚洲第一区在线 | 伊人网在线免费观看 | 亚洲一区精品在线 | 在线观看免费高清在线观看 | 亚洲日日干| 97精品在线观看 | 日韩欧美国产成人精品免费 | 无码国产色欲xxxx视频 | 中文字幕精品无码亚 | 亚洲天堂国产精品 | 人人九九 | 国产高潮流白浆喷水视频 | 欧美一区二区三区婷婷月色 | 丰满岳跪趴高撅肥臀尤物在线观看 | 在线视频亚洲 | 成人熟女一区二区 | 小泽玛利亚一区二区三区 | 亚洲av无码一区二区三区网址 | 美女视频黄是免费 | 一二级毛片| 久久久亚洲成人 |