android-APP長期運行於後臺,重啟後如何避免異常

問題的詳細描述是這樣的:
android中,當我們按home鍵(一般指手機的物理按鈕的中間那個鍵)回到手機桌面,此時app並沒有退出,而是一直運行與後臺中,此時如果我們點擊app圖標,還是會進入剛剛的界面之中。但是這存在一個問題,就是如果內存緊張或者當我們回到桌面,點擊瞭別的應用造成內存緊張,此時再通過點擊圖標進入app,此時會出現異常。這樣造成的用戶感覺非常不好!

其實,歸納起來,並不僅僅這種情況下造成數據丟失,造成數據丟失的情況有如下幾種:
(1)、當用戶按下HOME鍵時。
  這是顯而易見的,系統不知道你按下HOME後要運行多少其他的程序,自然也不知道activity A是否會被銷毀,因此系統會調用onSaveInstanceState(),讓用戶有機會保存某些非永久性的數據。
  (2)、長按HOME鍵,選擇運行其他的程序時。
  (3)、按下電源按鍵(關閉屏幕顯示)時。
  (4)、從activity A中啟動一個新的activity時。(這種情況應該是,當我們在activity A時,此時通知欄有其他的通知,我們點擊通知啟動activity B,此時我們進入別的應用)
  (5)、屏幕方向切換時,例如從豎屏切換到橫屏時。

值得幸運的是,android對此提供瞭非常好的解決辦法!

Activity的 onSaveInstanceState() 和 onRestoreInstanceState()並不是生命周期方法,它們不同於 onCreate()、onPause()等生命周期方法,它們並不一定會被觸發。當應用遇到意外情況(如:內存不足、用戶直接按Home鍵)由系統銷毀一個Activity時,onSaveInstanceState() 會被調用。但是當用戶主動去銷毀一個Activity時,例如在應用中按返回鍵,onSaveInstanceState()就不會被調用。因為在這種情況下,用戶的行為決定瞭不需要保存Activity的狀態。通常onSaveInstanceState()隻適合用於保存一些臨時性的狀態,而onPause()適合用於數據的持久化保存。

  在activity被殺掉之前調用保存每個實例的狀態,以保證該狀態可以在onCreate(Bundle)或者onRestoreInstanceState(Bundle) (傳入的Bundle參數是由onSaveInstanceState封裝好的)中恢復。這個方法在一個activity被殺死前調用,當該activity在將來某個時刻回來時可以恢復其先前狀態。
  

@Override
 protected void onSaveInstanceState(Bundle outState) {
 System.out.println(BaseActivity.onSaveInstanceState());
  outState.putString(loginname, Application.LOGINNAME);
  outState.putInt(classId, Application.classId);
  outState.putSerializable(classinfos, 
    (ArrayList)Application.getInstance().getClassInfos());
  super.onSaveInstanceState(outState);
 }

 @SuppressWarnings(unchecked)
 @Override
 protected void onRestoreInstanceState(Bundle savedInstanceState) {
  System.out.println(BaseActivity.onRestoreInstanceState());
  super.onRestoreInstanceState(savedInstanceState);
  if (savedInstanceState != null) {
   Application.LOGINNAME = savedInstanceState.getString(loginname);
   Application.classId = savedInstanceState.getInt(classId);
   Application.getInstance().setClassInfos(
     (List)savedInstanceState.getSerializable(classinfos));
  }
 }

實例代碼如上,通過重寫上面兩個方法保存一些需要當前界面或者整個應用需要使用的數據,緩存起來,等到重新啟動時,這些數據依然存在,這樣重啟之後不會造成app異常退出!

需要提醒的是,我們開發一個app的時候,activity是非常多的,一個界面中需要的數據很多,並且不知道用戶會在哪個activity中按下Home鍵退回到瞭手機桌面,這樣該如何處理呢?
此時的解決辦法是,使用一個基本BaseActivity,在BaseActivity重寫onSaveInstanceState和onRestoreInstanceState兩個方法,然後每個界面Activity繼承基類BaseActivity,這樣不必每個activity重寫這兩個方法,同時,不管在哪個activity中按下home鍵,都會把數據保存起來,重啟之後數據不至於丟失!

———————————— 分隔符—————————————-
另外,還有一個地方需要說明,有些app可能想每次點擊應用圖標的時候,都能夠進入主界面,不管此時app處於什麼狀態,不管app此時是否運行與後臺,這時可以使用activity的配置



         
                
                

            
        

啟動的activity中配置android:launchMode=”singleTask”即可。這樣配置,保證每次點擊應用圖標,都進入主界面內,不管此時app是否運行與後臺之中。

 

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。