切後臺關閉應用某項許可權,仿微信做法重新啟動應用
阿新 • • 發佈:2018-12-10
問題
切後臺關閉許可權,再次開啟應用,介面上的一些功能項不能正常使用
原因
由於關閉許可權,系統會將當前應用程序回收,再次開啟時系統會恢復任務棧中的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的相關資料