剛剛寫完了一個需求,之前一直不寫總結,想把這個需求寫一下
需求大概就是用戶設置生物識別,之後,每次App啓動之後調用,然後當App切換到後臺之後,過一段時間,再次打開App重新喚醒生物識別
首先需要調用調用的生物識別
- 先判斷用戶是否設置TouchID,
- 如果沒有則判斷用戶是否設置密碼,包含兩部分,圖案以及密碼
判斷App是否切換到前臺運行
指紋識別這個功能採用郭霖的大神的 Android指紋識別API講解,一種更快更好的用戶體驗 講解的非常明白
判斷並調用 系統的圖案 Android應用程序調用系統解鎖頁面 這篇文章說的也很明白
App前後臺的邏輯,忘記出自哪篇博客了
大概就是這三篇文章的合集,實現瞭如上的完整邏輯
此處就不貼郭霖大神的代碼了,只寫判斷邏輯
if (TouchUtils.getInstance().supportFingerprint(this)) {//出自郭霖代碼,直接copy
TouchUtils.getInstance().initKey();
TouchUtils.getInstance().initCipher(this);
} else if (TouchUtils.getInstance().initPassword(this)) {//出自調用系統圖案,直接copy
//TODO 調用圖案或者系統密碼!
TouchUtils.getInstance().showAuthenticationScreen(this);
}else{
//TODO 說明用戶手機沒設置密碼,或者什麼密碼都不支持
.....do;
}
}
上面的代碼是實現App初始化進入主頁面的邏輯
判斷App是否處於前臺後邏輯,網上有各種各樣的方案,而我採用了其中一種個人覺得穩定的
在Application的Oncreate()進行判斷
@Override
public void onCreate() {
super.onCreate();
AppFrontBackHelper helper = new AppFrontBackHelper();
helper.register(this, new AppFrontBackHelper.OnAppStatusListener() {
@Override
public void onFront() {
//應用切到前臺處理
//必須在此處!
startforeGround = System.currentTimeMillis();
doExit();
}
@Override
public void onBack() {
//應用切到後臺處理
startBackground = System.currentTimeMillis();
}
});
}
private void doExit() {
//120s!我這裏前後臺切換大於120s才進行喚醒touchid
//判斷是否啓動touchid
if (!SPUtils.getInstance().getBoolean(Constant.TOUCHID)) return;
if (startBackground != 0 && startforeGround != 0) {
long l = startforeGround - startBackgroun
if (l > 120 * 1000) {
//TODO 做你自己的處理
}
}
}
public class AppFrontBackHelper {
private OnAppStatusListener mOnAppStatusListener;
public AppFrontBackHelper() {
}
/**
* 註冊狀態監聽,僅在Application中使用
* @param application
* @param listener
*/
public void register(Application application, OnAppStatusListener listener){
mOnAppStatusListener = listener;
application.registerActivityLifecycleCallbacks(activityLifecycleCallbacks);
}
public void unRegister(Application application){
application.unregisterActivityLifecycleCallbacks(activityLifecycleCallbacks);
}
private Application.ActivityLifecycleCallbacks activityLifecycleCallbacks = new Application.ActivityLifecycleCallbacks() {
//打開的Activity數量統計
private int activityStartCount = 0;
@Override
public void onActivityCreated(Activity activity, Bundle savedInstanceState) {
}
@Override
public void onActivityStarted(Activity activity) {
activityStartCount++;
//數值從0變到1說明是從後臺切到前臺
if (activityStartCount == 1){
//從後臺切到前臺
if(mOnAppStatusListener != null){
mOnAppStatusListener.onFront();
}
}
}
@Override
public void onActivityResumed(Activity activity) {
}
@Override
public void onActivityPaused(Activity activity) {
}
@Override
public void onActivityStopped(Activity activity) {
activityStartCount--;
//數值從1到0說明是從前臺切到後臺
if (activityStartCount == 0){
//從前臺切到後臺
if(mOnAppStatusListener != null){
mOnAppStatusListener.onBack();
}
}
}
@Override
public void onActivitySaveInstanceState(Activity activity, Bundle outState) {
}
@Override
public void onActivityDestroyed(Activity activity) {
}
};
public interface OnAppStatusListener{
void onFront();
void onBack();
}
}
這裏用一個int值來標示當前Activity棧裏面活動的Activity數量
判斷App是否處於前後臺,邏輯十分巧妙
以上大概就是一個完整的功能實現
每一個功能點幾乎都是網上找的資料,我只是一個搬運工,把各個功能模塊合併了而已