APP 应用实现手势密码是非常常见的操作,比如支付宝中的手势密码 ,设置手势成功后,在应用切换前后台时,就要跳出来覆盖当前页面。
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 时的操作。
看看效果图:
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 就不提供了,在源码里提供。
源码:高仿支付宝手势密码