android应用运行中,在设置中修改权限,返回应用崩溃

权限管理

我程序中使用了PermissionsDispatcher进行权限的管理,具体使用方法,参考Android 6.0运行时权限详解。

问题重现

使用PermissionsDispatcher进行程序管理,在程序运行过程中,申请权限和拒绝权限都不会出现问题,后来发现,在程序运行过程中,比如进入某个页面,然后点击home键,在设置中,选择该应用,关闭某个权限,再返回该应用,点击back键,会出现闪退的情况,跟踪log,发现是某个字段变成了Null,刚开始以为程序问题,后来调试时发现,在设置修改权限以后,程序进程变成了dead,如图:
android应用运行中,在设置中修改权限,返回应用崩溃_第1张图片
发现微信的操作方法就是,设置关闭某个权限,就重新启动。
最初的解决办法,是在onResume方法里边,先保存一下现有权限,进入界面以后,再重新获取一下权限,看看有没有改变,如果权限改变,就重新进入启动页,重新获取数据,但是失败了,因为进程已经被杀死了,不会再走onResume方法。
最后的解决办法:在一个Activity的基类的onCreate方法中,判断savedInstanceState是否为null,如果为null,说明是正常启动,如果有数据,就是设置被修改,异常关闭情况下,程序会保存一些数据,所以在有数据的情况下,重新打开启动页。

 protected void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        Log.e("onCreate","savedInstanceState:"+savedInstanceState);
        if(savedInstanceState!=null){
            Intent intent=new Intent(UI.this, SplashActivity.class);
            intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
            startActivity(intent);
        }
    }

调试结果:
在这里插入图片描述
savedInstanceState:null是正常启动的情况,savedInstanceState有数据,是修改过权限,返回当前页面的情况,所以根据有没有数据,可以决定是否重新打开启动页。

参考文章:Android在应用设置里关闭权限,返回生命周期处理

你可能感兴趣的:(android开发技巧系列)