Android 高仿支付寶實現手勢密碼

APP 應用實現手勢密碼是非常常見的操作,比如支付寶中的手勢密碼 ,設置手勢成功後,在應用切換前後臺時,就要跳出來覆蓋當前頁面。

1,怎麼確定應用是從後天切到前臺呢?android 4.4 以後提供一個監控Activity 生命週期的接口 

ActivityLifecycleCallbacks:
public interface ActivityLifecycleCallbacks {
        void onActivityCreated(Activity activity, Bundle savedInstanceState);
        void onActivityStarted(Activity activity);
        void onActivityResumed(Activity activity);
        void onActivityPaused(Activity activity);
        void onActivityStopped(Activity activity);
        void onActivitySaveInstanceState(Activity activity, Bundle outState);
        void onActivityDestroyed(Activity activity);
    }

通過ActivityStarted 和 ActivityStoped 這兩個生命週期,我們可以判斷出前後臺切換的情況:

private var mFinalCount: Int = 0

override fun onActivityStarted(activity: Activity?) {
        mFinalCount ++

        //如果mFinalCount ==1,說明是從後臺到前臺
        Log.e(TAG, "onActivityStarted:"+mFinalCount.toString())
        if (mFinalCount == 1) {
            //說明從後臺回到了前臺
            Log.e(TAG, mFinalCount.toString() + "說明從後臺回到了前臺")
        
        }
    }

設置一個變量mFinalCount  每次onActivityStarted mFinalCount ++ ,當mFinalCount ==1 時 代表 從後臺回到了前臺,這個時候應該啓動手勢密碼界面。

 override fun onActivityStopped(activity: Activity?) {
        mFinalCount--
        //如果mFinalCount ==0,說明是前臺到後臺
        Log.e(TAG, "onActivityStopped:"+mFinalCount.toString())
        if (mFinalCount == 0) {
            //說明從前臺回到了後臺
            Log.e(TAG, mFinalCount.toString() + "說明從前臺回到了後臺")
        }
    }

onStoped 時的操作。

 

看看效果圖:

 

2,使用本地廣播 實現前後臺切換通知主頁面

 override fun onActivityStarted(activity: Activity?) {
        mFinalCount ++

        //如果mFinalCount ==1,說明是從後臺到前臺
        Log.e(TAG, "onActivityStarted:"+mFinalCount.toString())
        if (mFinalCount == 1) {
            //說明從後臺回到了前臺
            Log.e(TAG, mFinalCount.toString() + "說明從後臺回到了前臺")
            val intent = Intent("GESTURE_BROADCAST")
            LocalBroadcastManager.getInstance(mContext).sendBroadcast(intent)
        }
    }

在 MainActivity中接收廣播並且 啓動手勢密碼邏輯,以下是廣播接收器

 /**
     * 手勢密碼
     */
    internal inner class GestureReceiver : BroadcastReceiver() {
        override fun onReceive(context: Context, intent: Intent) {
            gestureSetting()
        }
    }

 

啓動頁面:

 private fun gestureSetting()
    {

            val nowTime = Calendar.getInstance().timeInMillis
            val openGesture = SPUtils.getInstance().getBoolean("isOpenHandLock", false)
            if (nowTime - lastGestureTime > 1000 && openGesture) {
                lastGestureTime = nowTime
                Handler().postDelayed({
                    val intent = Intent(this@MainActivity, GestureActivity::class.java)
                    startActivity(intent)
                    // overridePendingTransition(0, 0);
                }, 200)


        }
    }

註冊廣播:

  private fun receiverGesture() {
        filter = IntentFilter()
        filter?.addAction("GESTURE_BROADCAST")
        gestureReceiver = GestureReceiver()//創建廣播接受者對象
        LocalBroadcastManager.getInstance(this).registerReceiver(gestureReceiver!!, filter!!)//註冊
    }

這樣,手機密碼簡單的邏輯就實現了。手勢密碼的View 就不提供了,在源碼裏提供。

源碼:高仿支付寶手勢密碼

 

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