背景:当app从前台切换至后台后,三分钟后切换至前台,需要都进入到密码校验页面.
解决思路:监听Activity的生命周期.
1.在BaseActivity里面的oncreate里面注册
registerActivityLifecycleCallbacks Activity的生命周期方法
registerActivityLifecycleCallbacks(new ActivityLifecycleCallbacks() {
@Override
public void onActivityCreated(@NonNull Activity activity, @Nullable Bundle bundle) {
isForeground = true;
}
@Override
public void onActivityStarted(@NonNull Activity activity) {
if (isForeground) {
//do nothing
} else {
long currentTimeMillis = System.currentTimeMillis();
if ((currentTimeMillis - startSwitchBackgroundTime) > Constants.THREE_MINUTES) {
sendBroadcast(new Intent(Constants.ACTION_VERIFY_PIN));
}
}
}
@Override
public void onActivityResumed(@NonNull Activity activity) {
}
@Override
public void onActivityPaused(@NonNull Activity activity) {
}
@Override
public void onActivityStopped(@NonNull Activity activity) {
if (UIUtils.isBackground(BaseApplication.this)) {
isForeground = false;
startSwitchBackgroundTime = System.currentTimeMillis();
}
}
@Override
public void onActivitySaveInstanceState(@NonNull Activity activity, @NonNull Bundle bundle) {
}
@Override
public void onActivityDestroyed(@NonNull Activity activity) {
}
});
2.所有的页面都继承BaseActivity
3.在BaseActivity里面注册一个广播,广播的作用用于跳转到密码校验页面,为防止内存泄漏需要在onDestory里面取消注册广播
static class AppStatusBroadcast extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
context.startActivity(new Intent(Constants.INTENT_ACTION_PIN_VERIFY));
}
}
4.这样可满足切换前后台监听的要求
上述解决存在的问题是,当所有的页面都继承baseactivity 从主页跳转到A页面 ,A跳转到B页面,就相当于Activity栈有3个页面,当从后台切换至前台时由于三个Activity都没有销毁会启动三次密码验证页面,这样不合理,解决方式是,只需要将密码验证的Activity的启动模式设置成SingleTask即可保证同一个栈不会重复创建同一个密码验证页面