转载注明出处: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) {
}
});
}