问题描述
App在后台时,在设置中手动拒绝某项权限,在返回App造成的闪退或者数据异常。
排查问题
开始认为是代码本身的问题,处理了几个空指针等问题,还是不行。修改了权限后,App内存中储存的数据就会变为空,而onCreate()
方法中的savedInstanceState
参数变为非空(不为null)。确定问题出在了onSaveInstanceState()
上,当一个Activity
被杀死之前,会调用onSaveInstanceState()
来保存当前Activity
的状态数据。然后Activity
重新打开时,用来保存状态信息的Bundle
会同时传给onRestoreInstanceState()
和onCreate()两
个方法。而拒绝权限会导致Activity
被杀死,所以onCreate()
的参数才会有值。
处理方案
- 根本性的解决方法
在每个Activity
中都使用onSaveInstanceState()
在被杀死前保存数据,重新打开后通过另外的两个方法取出并处理数据。但是这个方法不太现实,一个项目中存在很多Activity
,如果每个都添加相关的逻辑就会产生巨大的工作量,项目时间又紧根本没有时间去完成。 - 讨巧的方法
是在手动拒绝权限后重启App(微信等App也是这么处理的)。
具体的代码是:
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//如果Activity被杀死后,又重新打开了就重启App
if (savedInstanceState != null) {
final Intent intent = getPackageManager().getLaunchIntentForPackage(getPackageName());
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(intent);
//另一种重启方式
//android.app.ActivityManager manager = (android.app.ActivityManager) this.getSystemService(Context.ACTIVITY_SERVICE);
//manager.killBackgroundProcesses("App的包名");
}
...
}