当我们使用手机银行app时,突然收到短信或电话时app会进入后台,再次回到手机银行界面的时候会被要求重新输入登陆密码或验证指纹,这一需求的设计主要是出于安全性考虑,验证用户身份,保证资金的稳固。
那么,以上的需求又是怎么实现的呢?怎么监听app的状态,达到app进入后台再回到前台时,总是跳出一个界面要求用户输入登陆密码或验证指纹呢?
1.在application中注册监听方法,一般写在onCreate方法中
@Override
public void onCreate() {
super.onCreate();
initBackgroundCallBack();
}
2.实现监听方法,主要通过registerActivityLifecycleCallbacks 方法实现
private void initBackgroundCallBack() {
registerActivityLifecycleCallbacks(new ActivityLifecycleCallbacks() {
@Override
public void onActivityCreated(Activity activity, Bundle savedInstanceState) {
}
@Override
public void onActivityStarted(Activity activity) {
}
@Override
public void onActivityResumed(Activity activity) {
}
@Override
public void onActivityPaused(Activity activity) {
}
@Override
public void onActivityStopped(Activity activity) {
}
}
@Override
public void onActivitySaveInstanceState(Activity activity, Bundle outState) {
}
@Override
public void onActivityDestroyed(Activity activity) {
}
});
}
这里需要解释下registerActivityLifecycleCallbacks这个方法,只要app中有一个activity的生命周期改变了就会调用registerActivityLifecycleCallbacks的相应方法.
比如说闪屏页splashActivity走了onCreate方法,registerActivityLifecycleCallbacks的onActivityCreated也会被调用,括号中的参数activity就是splashActivity本身
3.具体实现应用进入后台,回到前台监听,需要实现两个方法onActivityStarted,onActivityStopped
先上代码:
private void initBackgroundCallBack() {
registerActivityLifecycleCallbacks(new ActivityLifecycleCallbacks() {
@Override
public void onActivityCreated(Activity activity, Bundle savedInstanceState) {
}
@Override
public void onActivityStarted(Activity activity) {
appCount++;
if (isRunInBackground) {
//应用从后台回到前台 需要做的操作
back2App(activity);
}
}
@Override
public void onActivityResumed(Activity activity) {
}
@Override
public void onActivityPaused(Activity activity) {
}
@Override
public void onActivityStopped(Activity activity) {
appCount--;
if (appCount == 0) {
//应用进入后台 需要做的操作
leaveApp(activity);
}
}
@Override
public void onActivitySaveInstanceState(Activity activity, Bundle outState) {
}
@Override
public void onActivityDestroyed(Activity activity) {
}
});
}
/**
* 从后台回到前台需要执行的逻辑
*
* @param activity
*/
private void back2App(Activity activity) {
isRunInBackground = false;
}
/**
* 离开应用 压入后台或者退出应用
*
* @param activity
*/
private void leaveApp(Activity activity) {
isRunInBackground = true;
}
这里需要解释两个变量:
appCount 是为了判断应用是否进入后台,当一个activity的调用onStart方法时appCount就会+1,调用onStop方法时appCount就会-1,得到的appCount=0,当所有activity的appCount都=0时,说明所有的activity都在后台,即整个应用都处于后台
isRunInBackground 是为了判断应用是否在后台,如果应用在后台又被调用了onActivityStarted方法,说明应用从后台回到前台
搞清楚了这两个变量后,我们就可以在back2App和leaveApp这两个方法中加入自己所需要的业务逻辑,实现与手机银行后台回到前台输入密码类似的功能。