android 手势密码功能sdk,利用ActivityLifecycleCallBack监控app前后台状态切换,实现手势密码即九宫格解锁...

转载注明出处:http://blog..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) {

}

});

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值