2010-10-18 38 views
14

後服務進程終止後我一直在閱讀Android文檔,並且想知道是否有人能夠揭示服務實例在START_STICKY啓動服務時會發生什麼情況,從而導致進程被終止。我假設本地狀態數據(實例變量)也丟失。當Android重新創建服務時,Android是否做了任何事情來幫助重新填充本地狀態?onStartCommand在啓動START_STICKY

我有在意圖發送到服務的一些數據。在onStateCommand()中,我會根據意圖中的內容填充服務的實例數據。根據我在Android文檔中讀到的內容,當服務被終止並重新啓動(使用START_STICKY)時,傳遞給onStartCommand()的意圖將爲空。這是否意味着當服務被重新創建時,我失去了意圖和服務的成員數據?

回答

16

當進程被終止並被重新創建時,它會再次遍歷整個生命週期(從onCreate開始)。根據它被殺死的方式以及如何保存數據,它可能會或可能不會提供給您。

至於獲取意圖回來,有一個標誌START_REDELIVER_INTENT將重新傳遞意圖。

+0

感謝您確認我的懷疑。我不知道START_REDLIVER_INTENT(必須掩蓋部分文檔)。 – adstro 2010-10-19 01:18:34

+0

感謝的人,我被這個錯誤了將近一個月落馬......終於找到了Android操作系統殺死服務... – 2015-09-03 17:37:52

+0

尼斯。我從來不知道'START_REDELIVER_INTENT',它肯定派上了用場@Falmarri – 2016-07-31 00:14:37

1

當它重新啓動您的服務時,Android不會重新填充「丟失的」數據值,因此您的代碼需要迎合這種可能性。

我的方法是使用所有非原始狀態變量並將它們保留爲空。這樣我可以測試null並採取適當的步驟來初始化它們。

我已經採取了存儲輕量級數據,我希望在應用程序的首選項中跨應用程序重新啓動持久化。

2

我最近遇到同樣的問題來了。服務不提供保存狀態的內置手段,最後的意圖可能不足以使服務恢復到之前的狀態。我的解決方案是讓活動保持狀態並通過startService()將該狀態傳遞給服務。然後,服務只是觸發事件的活動,如:

  • 這裏是一個更新
  • 東西死了,這裏的例外
  • 我已經殺了,請重新啓動我的任何必要的狀態

這種方法清理我設計了很多,既服務和活動是有彈性的,以被殺害。

+2

ü可以分享一些代碼塊爲同?? 這個概念看起來很理想,但不能實現它 – 2012-09-27 10:55:53

1

使用內部存儲單獨保存對象或其領域。

public void writeToInternalStorage(String fileName,String userName) 
    { 
     try{ 
      String endOfLine = System.getProperty("line.separator"); 
      StringBuffer buffer = new StringBuffer(); 

      FileOutputStream fos = openFileOutput(fileName, Context.MODE_PRIVATE); //// MODE_PRIVATE will create the file (or replace a file of the same name) and make it private to your application. Other modes available are: MODE_APPEND, MODE_WORLD_READABLE, and MODE_WORLD_WRITEABLE. 

      buffer.append(userName.toString() + endOfLine); 
      fos.write(buffer.toString().getBytes()); 


      Log.v(TAG, "writeFileToInternalStorage complete.. " + buffer.toString()); 
      //  writer.write(userName); 

      fos.close(); 
     } 
     catch(Exception e) 
     { 
      Log.v(TAG, "Error: " + e.getMessage()); 
      ExceptionNotificationMessage("writeToInternalStorage() Error: " + e.getMessage()); 
     } 
    } 

    public String readFromInternalStorage(String fileName) 
    { 
     try{ 
      File file = this.getFileStreamPath(fileName); 
      if(file.exists() == true) 
      { 
       Log.v(TAG, "readFileFromInternalStorage File found...");  

       FileInputStream fis = openFileInput(fileName); 
       StringBuilder buffer = new StringBuilder();    
       int ch; 
       while((ch = fis.read()) != -1){ 
        buffer.append((char)ch); 
       } 

       Log.v(TAG, "readFileFromInternalStorage complete.. " + buffer.toString()); 
       fis.close(); 

       return buffer.toString(); 
      } 
     } 
     catch(Exception e) 
     { 
      Log.v(TAG, "Error: " + e.getMessage()); 
      ExceptionNotificationMessage("readFromInternalStorage() Error: " + e.getMessage()); 
     } 
     return ""; 
    } 
相關問題