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 时的操作。

 

看看效果图:

Android 高仿支付宝实现手势密码_第1张图片

 

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 就不提供了,在源码里提供。

源码:高仿支付宝手势密码

 

你可能感兴趣的:(View)