切后台关闭应用某项权限,仿微信做法重新启动应用

版权声明:欢迎转载 有不明白的 写的不正确的地方 欢迎一起讨论 谢谢 https://blog.csdn.net/qq_27744987/article/details/84939295

问题

切后台关闭权限,再次打开应用,界面上的一些功能项不能正常使用

原因

由于关闭权限,系统会将当前应用进程回收,再次打开时系统会恢复任务栈中的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,也就是肯定没值

  • 在以下几种情况会有值(这里只先举例几种场景)

    1. ActivityA启动ActivityB时,系统会保存ActivityA界面上View的相关数据
      Fragment的相关数据等其他数据(在onSaveInstanceStated(bundle)分析打印bundle的日志看出来的,应该还有其他数据会保存到bundle,需要看源码才可确认)
    2. 切后台会触发onSaveInstanceStated(),系统就会保存Activity的一些数据到Bundle

猜你喜欢

转载自blog.csdn.net/qq_27744987/article/details/84939295