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 就不提供了,在源碼裏提供。
源碼:高仿支付寶手勢密碼