日韩性视频-久久久蜜桃-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)容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 男生吃小头头的视频 | 欧美高清二区 | 亚洲综合站 | 伊人久久色 | 成人免费视频网址 | 亚洲图色在线 | 豆花视频在线播放 | 国产午夜视频 | 免费黄网站在线 | 欧美日韩亚洲国产另类 | 国产又粗又猛视频 | 久久99久久99精品中文字幕 | 欧美粗暴jizz性欧美20 | 草草影院欧美 | 性视频免费 | 韩国性经典xxxxhd | 国产一二视频 | 依人在线视频 | 三级视频久久 | 日韩在线免费看 | 日韩精品视频免费在线观看 | 成人激情视频在线 | 九色自拍视频 | 密臀av| 4438x全国最大成人 | 9l视频自拍蝌蚪9l视频成人 | 日韩一级免费视频 | 免费精品在线视频 | 女同hd系列中文字幕 | 欧色av | 黄色在线播放视频 | 91在线观看免费高清完整版在线观看 | 日韩人妻无码一区二区三区 | 久久精品大全 | 爱福利视频一区 | 国产成人自拍在线 | 这里只有精品视频 | 日本青青草视频 | 变态另类丨国产精品 | 国产精品久久综合视频 | 华人在线视频 | 成人av观看 | 九九九九久久久久 | 黄色小说在线免费观看 | 欧美日韩中文字幕在线视频 | a级片在线 | www.色日本| 亚欧洲精品在线视频免费观看 | 国产精品一二三级 | 成人欧美精品 | 久久精品91 | 少妇精品无码一区二区免费视频 | 中文字幕亚洲乱码熟女1区2区 | 毛片天堂 | 欧美国产日韩一区二区三区 | 美女扒开腿让男生捅 | 中文字幕第五页 | 日本激情一区 | 四虎影视永久 | 天天视频黄 | 最近最好的2019中文 | 国产.com| 色老二导航 | 视频在线观看一区二区 | 天堂中文在线资源 | 午夜丁香婷婷 | 亚洲 欧美 日韩系列 | 精品+无码+在线观看 | 中文字幕一区二区三区人妻电影 | 免费视频www在线观看网站 | 欧亚在线视频 | 久草青青视频 | 中文字幕亚洲无线码在线一区 | 国产精品国色综合久久 | 一本综合久久 | 久久金品 | 国产91综合| 国产激情视频在线播放 | 91精品综合久久 | 日本乱大交xxxx公交车 | 日韩亚洲视频在线观看 | 四季av日韩精品一区 | 欧美日本免费 | h片在线看 | 日韩成人精品 | 羞羞动态图 | 黄色一级在线播放 | 五月激情综合婷婷 | 亚洲综合精品国产一区二区三区 | 女同毛片一区二区三区 | 国产精品久久久久久久久久免费 | 欧美成人a∨高清免费观看 国产精品999视频 | 在线国产视频 | 性猛交富婆╳xxx乱大交麻豆 | 天天操天天射天天 | 男人操女人下面视频 | 色av一区| 成人激情在线视频 | 凹凸日日摸日日碰夜夜 |