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


猜你喜欢

转载自blog.csdn.net/coderder/article/details/51063493
今日推荐