利用ActivityLifecycleCallBack監控app前後臺狀態切換,實現手勢密碼即九宮格解鎖
轉載註明出處:http://blog.csdn.net/coderder/article/details/51063493
利用ActivityLifecycleCallbacks監控app前後臺狀態切換,實現手勢密碼
最近由於專案需求,需要在應用中加入手勢密碼這個功能,具體需求是這樣的:首次啟動應用會和後臺校驗手勢密碼,當切換到後臺超過5分鐘後,應用再次進入前臺需要判斷進入手勢解鎖介面; 當看到這個需求的時候,我首先想到的就是在應用的application類中應該會有整個application生命週期的回掉,但是剛開始不知道有ActivityLifecycleCallbacks這個監控整個應用每個activity生命週期的API,遂又想到在baseactivity中利用ActivityManager中通過RunningTaskInfo拿到前臺activity是否屬於自己應用,來判斷應用是在前臺還是後臺,但是這個方法太笨重了,而且不優雅。
Android在SDK 14提供了一個Callback即ActivityLifecycleCallbacks,通過這個Callback可拿到App所有
Activity的生命週期回撥
@Override public void onCreate() { super.onCreate(); registerActivityLifecycleCallbacks(new ActivityLifecycleCallbacks() { @Override public void onActivityCreated(Activity activity, Bundle savedInstanceState) { } @Override public void onActivityStarted(Activity activity) { } @Override public void onActivitySaveInstanceState(Activity activity, Bundle outState) { } @Override public void onActivityResumed(Activity activity) { } @Override public void onActivityPaused(Activity activity) { } @Override public void onActivityStopped(Activity activity) { } @Override public void onActivityDestroyed(Activity activity) { } }); }
怎麼樣,是不是清爽了許多。。。。
緊接著問題來了,現在是拿到了應用中每個activity的生命週期,怎麼判斷當前應用是在前後臺呢,這個難不倒我們
開發者啊,可以定義一個計數器嘛,定義全域性變數int count,activity開啟加一,關閉減一,寫在哪些方法中呢?經過個人實踐,
最佳方法是分別在onActivityStarted()(count++),onActivityStopped()(count--); 哈哈,這不就有思路了嗎,程式碼擼起來。。。
PS:有人肯定會問:為啥不在onActivityResumed()和onActivityPaused()中進行計數呢,好,現在假設有這麼種情況,應用內由ActivityA---->ActivityB,會執行:ActivityA(onPause())-->ActivityB(onCreate())-->ActivityB(onStart())-->ActivityB(onResume())-->ActivityA(onStop()),那麼此時count減一,為0了,判斷是在後臺了,可是明明在前臺啊,所以放在這兩個生命週期進行count的計算時不準確的。
好了,關於後臺五分鐘判斷:看程式碼:
public class MyApplication extends Application {
private long time = -2;
public int count = 0;
@Override
public void onCreate() {
super.onCreate();
registerActivityLifecycleCallbacks(new ActivityLifecycleCallbacks() {
@Override
public void onActivityCreated(Activity activity, Bundle savedInstanceState) {
}
@Override
public void onActivityStarted(Activity activity) {
if (count == 0) {
//Log.v("tag", ">>>>>>>>>>>>>>>>>>>切到前臺 lifecycle");
// 首先計算時間 網路請求判斷是否進入手勢密碼驗證介面
Log.v("cjq", ">>>>>>>>>>>>>>>>>>>切到前臺 lifecycle");
if (-2 == time) {
//判斷進入解鎖手勢密碼
} else {
Date date2 = new Date();
returnTime = date2.getTime();
double sub = BigDecimalUtils.sub2(new BigDecimal(returnTime), new BigDecimal(time));
if (sub >= 300000d) {
//判斷進入解鎖手勢密碼
} else {
time = -1;
}
}
} else {
if (-2 == time) {
//判斷進入解鎖手勢密碼
}
time = -1;
}
count++;
}
@Override
public void onActivitySaveInstanceState(Activity activity, Bundle outState) {
}
@Override
public void onActivityResumed(Activity activity) {
}
@Override
public void onActivityPaused(Activity activity) {
}
@Override
public void onActivityStopped(Activity activity) {
count--;
if (count == 0) {
Log.v("tag", ">>>>>>>>>>>>>>>>>>>切到後臺 lifecycle");
date = new Date();
time = date.getTime();
} else {
time = -1;
}
}
@Override
public void onActivityDestroyed(Activity activity) {
}
});
}