利用ActivityLifecycleCallBack监控app前后台状态切换,实现手势密码

来源:互联网 发布:北京致远软件 编辑:程序博客网 时间:2024/06/05 03:10

转载注明出处: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的生命周期回调 

@Overridepublic void onCreate() {super.onCreate();registerActivityLifecycleCallbacks(new ActivityLifecycleCallbacks() {@Overridepublic void onActivityCreated(Activity activity, Bundle savedInstanceState) {}@Overridepublic void onActivityStarted(Activity activity) {}@Overridepublic void onActivitySaveInstanceState(Activity activity, Bundle outState) {}@Overridepublic void onActivityResumed(Activity activity) {}@Overridepublic void onActivityPaused(Activity activity) {}@Overridepublic void onActivityStopped(Activity activity) {}@Overridepublic 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;@Overridepublic void onCreate() {super.onCreate();registerActivityLifecycleCallbacks(new ActivityLifecycleCallbacks() {@Overridepublic void onActivityCreated(Activity activity, Bundle savedInstanceState) {}@Overridepublic 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++;}@Overridepublic void onActivitySaveInstanceState(Activity activity, Bundle outState) {}@Overridepublic void onActivityResumed(Activity activity) {}@Overridepublic void onActivityPaused(Activity activity) {}@Overridepublic void onActivityStopped(Activity activity) {count--;if (count == 0) {Log.v("tag", ">>>>>>>>>>>>>>>>>>>切到后台  lifecycle");date = new Date();time = date.getTime();} else {time = -1;}}@Overridepublic void onActivityDestroyed(Activity activity) {}});}


1 0