手勢(shì)密碼
最近項(xiàng)目需要需要做一個(gè)手勢(shì)密碼功能,所以查找了一下相關(guān)的資料.其實(shí)Github上面相關(guān)的開源控件還是很多的,大體上實(shí)現(xiàn)也是類似的,本次使用的手勢(shì)密碼的開源框架的庫是DreaminginCodeZH的PatternLock.另外一方面,其實(shí)實(shí)現(xiàn)手勢(shì)密碼的核心還是在于手勢(shì)密碼的觸發(fā)機(jī)制,這一點(diǎn)就涉及到應(yīng)用在前臺(tái)與后臺(tái)之間切換狀態(tài)的監(jiān)控了.
實(shí)現(xiàn)步驟
稍微逛了一下簡(jiǎn)書和CSDN,發(fā)現(xiàn)在監(jiān)控應(yīng)用前后臺(tái)切換狀態(tài)方面也有幾種實(shí)現(xiàn)方式,本文選擇一種比較簡(jiǎn)單的方式進(jìn)行說明.
1.首先是需要繼承Application類實(shí)現(xiàn)自己的的自定義Application.
2.在自定義的Application的onCreate()方法中使用registerActivityLifecycleCallbacks()方法,該方法引用的匿名類中的方法可以實(shí)現(xiàn)對(duì)應(yīng)用的所有Activity進(jìn)行狀態(tài)統(tǒng)計(jì),從而達(dá)到監(jiān)控應(yīng)用前后臺(tái)切換狀態(tài)的效果.
3.加入一些判斷條件,例如在我們的應(yīng)用中就加入了判斷應(yīng)用是冷啟動(dòng)還是熱啟動(dòng)的條件,從而達(dá)到實(shí)現(xiàn)某些特定的需求.
實(shí)現(xiàn)如下
private long time = -2;
private int count = 0;
registerActivityLifecycleCallbacks(new ActivityLifecycleCallbacks() {
@Override
public void onActivityCreated(Activity activity, Bundle savedInstanceState) {
LogUtils.D(TAG, "onActivityCreated()");
}
@Override
public void onActivityStarted(Activity activity) {
LogUtils.D(TAG, "onActivityStarted()");
if (count == 0) {
//Log.v("tag", ">>>>>>>>>>>>>>>>>>>切到前臺(tái) lifecycle");
// 首先計(jì)算時(shí)間 網(wǎng)絡(luò)請(qǐng)求判斷是否進(jìn)入手勢(shì)密碼驗(yàn)證界面
LogUtils.D(TAG, ">>>>>>>>>>>>>>>>>>>切到前臺(tái) lifecycle");
if (-2 == time) {
//判斷進(jìn)入解鎖手勢(shì)密
}
} else {
Date date2 = new Date();
long returnTime = date2.getTime();
double sub = new BigDecimal(returnTime).subtract(new BigDecimal(time)).doubleValue();
if (sub >= 3000d) {//此處是判斷應(yīng)用到后臺(tái)多久時(shí)間以后需要開啟手勢(shì)密碼
//判斷進(jìn)入解鎖手勢(shì)密碼\ } else {
time = -1;
}
} else {
if (-2 == time) {
//判斷進(jìn)入解鎖手勢(shì)密 }
}
time = -1;
}
count++;
}
@Override
public void onActivityResumed(Activity activity) {
LogUtils.D(TAG, "onActivityResumed()");
}
@Override
public void onActivityPaused(Activity activity) {
LogUtils.D(TAG, "onActivityPaused()");
}
@Override
public void onActivityStopped(Activity activity) {
LogUtils.D(TAG, "onActivityStopped()");
count--;
if (count == 0) {
LogUtils.D(TAG, ">>>>>>>>>>>>>>>>>>>切到后臺(tái) lifecycle");
Date date = new Date();
time = date.getTime();
} else {
time = -1;
}
}
@Override
public void onActivitySaveInstanceState(Activity activity, Bundle outState) {
LogUtils.D(TAG, "onActivitySaveInstanceState()");
}
@Override
public void onActivityDestroyed(Activity activity) {
LogUtils.D(TAG, "onActivityDestroyed()");
}
});
好了,一個(gè)簡(jiǎn)單的手勢(shì)密碼功能就這樣子實(shí)現(xiàn)了.這是我用MarkDown軟件寫的第一篇文章,也是我近幾年第一次寫的公開的正兒八經(jīng)的文章吧,以后多堅(jiān)持寫作,積累,不會(huì)寫不是不寫的理由,而是多寫的動(dòng)力.Let's keep on moving.