问题
切后台关闭权限,再次打开应用,界面上的一些功能项不能正常使用
原因
由于关闭权限,系统会将当前应用进程回收,再次打开时系统会恢复任务栈中的Activity,但是系统给恢复的Activity中数据并不完整
例如:
一个Fragment中有个View的点击事件是通过在Fragment对外提供了setListener()的方式实现点击监听,而不是在Fragment的onCreate()中设置的点击监听;
系统虽然会给你恢复创建个Fragment,但是不可能给你调用setListener()方法设置点击监听,所以导致一些功能项不能正常使用
解决方案
在Application中设置一个全局Activity生命周期监听,Application的生命周期监听中的onActivityCreated()方法执行会优先于Activity的onCreated(),
所以在onActivityCreated()中做判断,只要Bundle有值(想要关闭某项权限时肯定会切后台也就是Bundle肯定有值)就表示应用被切后台关闭权限,有值就清空当前任务栈,重新启动应用的首页.
在Application中设置一个全局Activity生命周期监听
registerActivityLifecycleCallbacks(new Application.ActivityLifecycleCallbacks() {
@Override
public void onActivityCreated(Activity activity, Bundle savedInstanceState) {
if (savedInstanceState != null) {
Intent intent = new Intent(activity, LauncherActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK | Intent.FLAG_ACTIVITY_NEW_TASK);
activity.startActivity(intent);
}
}
@Override
public void onActivityStarted(Activity activity) {}
@Override
public void onActivityResumed(Activity activity) {}
....
@Override
public void onActivityDestroyed(Activity activity) {}
}
Bundle有值或没值的情况分析
-
没值
正常startActivity的时候,Activity的onCreate(Bundle)的参数Bundle肯定是等于null,也就是肯定没值
-
在以下几种情况会有值(这里只先举例几种场景)
- ActivityA启动ActivityB时,系统会保存ActivityA界面上View的相关数据
Fragment的相关数据等其他数据(在onSaveInstanceStated(bundle)分析打印bundle的日志看出来的,应该还有其他数据会保存到bundle,需要看源码才可确认) - 切后台会触发onSaveInstanceStated(),系统就会保存Activity的一些数据到Bundle
- ActivityA启动ActivityB时,系统会保存ActivityA界面上View的相关数据