安卓指紋識別+圖案密碼鎖+App前後臺切換之後重新喚醒密碼鎖

剛剛寫完了一個需求,之前一直不寫總結,想把這個需求寫一下
需求大概就是用戶設置生物識別,之後,每次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是否處於前後臺,邏輯十分巧妙

以上大概就是一個完整的功能實現

每一個功能點幾乎都是網上找的資料,我只是一個搬運工,把各個功能模塊合併了而已

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章