[英]How can I make sure Android Beam doesn't start a new instance of my 'singleTop' activity?
[英]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.