1. 程式人生 > >利用ActivityLifecycleCallBack監控app前後臺狀態切換,實現手勢密碼即九宮格解鎖

利用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) {
			}		
		});
	}