簡體   English   中英

如果Android重新啟動我的應用程序,如何確定它不會加載最新片段?

[英]If Android restarts my app, how can I make sure it doesn't load the most recent fragment?

我的應用程序包含兩個活動:SignInActivity和MainActivity。 SignInActivity允許用戶登錄,並初始化應用程序正常運行所需的一堆重要變量。 MainActivity包含一堆組成實際應用程序的片段。 這些片段將MVVM體系結構與ViewModel一起使用。 Fragment類從其ViewModel加載信息以顯示在屏幕上。

一個Fragment AppleFragment通過調用vm.getAppleType().getName()加載蘋果(用戶先前輸入的)類型。 然后,AppleFragment在屏幕上顯示蘋果的類型。 用戶只能在設置了蘋果類型之后導航至AppleFragment。

假設用戶在MainActivity和AppleFragment中使用我的應用程序時按下了主頁按鈕。 該應用程序將移至后台,並且可能會被Android操作系統殺死以節省內存。 如果是這種情況,然后用戶轉到“概述”屏幕(即方形按鈕)並選擇要打開的應用程序,Android將重新啟動上次打開的活動(MainActivity),以及上一次打開的片段(AppleFragment),但所有變量(包括ViewModels中的變量)都是新鮮的-即從頭開始。

由於AppleFragment在onViewCreated()中加載vm.getAppleType().getName() ,並且ViewModel完全空白-請記住,Android銷毀了所有內容以節省內存vm.getAppleType().getName()導致NPE並導致應用崩潰。

為了減輕這種情況,我讓MainActivity檢查重要的應用程序變量是否已初始化,如果沒有初始化,請啟動SignInActivity。 想法是,在上述情況下,用戶將被重定向到SignInActivity,並且應用程序將在用戶登錄時填充重要變量。用戶無法導航至AppleFragment,除非他們設置了Apple類型,然后,ViewModel可以提供給AppleFragment顯示。

這種方法不能完全起作用,因為startActivity()調度SignInActivity,但是不會立即啟動它-尤其是要等到MainActivity的所有生命周期方法都運行完之后,才能啟動它。 看來,作為MainActivity的onStart()方法的一部分,最近查看的片段AppleFragment已加載。 這是我們遇到麻煩的地方,因為AppleFragment在其onViewCreated方法中調用vm.getAppleType().getName()導致NPE和應用程序崩潰。

文檔

如果您不需要存儲大量數據並且不需要結構,則應使用SharedPreferences。 使用SharedPreferences API,您可以讀寫原始數據類型的持久鍵值對:布爾值,浮點數,整數,長型和字符串。

我認為這應該可以解決您的問題。

當變量丟失時,我認為重定向用戶重新登錄是不可行的。 我建議將這些值保存在SharedPrefences中。 如果您擔心安全性,可以閱讀: Android SharedPreference安全性

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM