1. 程式人生 > >切後臺關閉應用某項許可權,仿微信做法重新啟動應用

切後臺關閉應用某項許可權,仿微信做法重新啟動應用

問題

切後臺關閉許可權,再次開啟應用,介面上的一些功能項不能正常使用

原因

由於關閉許可權,系統會將當前應用程序回收,再次開啟時系統會恢復任務棧中的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