2012-07-20 119 views
0

我從活動創建了一個已啓動的服務。我很好奇:如果活動被破壞會發生什麼?服務是否仍然運行? (我認爲它運行!)活動被破壞並重新創建後開始訪問服務

然後,當活動重新創建,有什麼辦法與該服務進行通信?我只需要知道服務是否仍在運行,如果正在運行,那麼我想將活動的引用傳遞給服務。

+0

取決於服務類型。取決於您的啓動參數。有些會通過電話關機/開機或重新開機。定時器服務將需要由您的應用程序重新啓動(需要註冊以啓動通知才能完成此操作)。如果您需要註冊喚醒並處理廣播,則您的服務將保持過去應用程序銷燬的狀態。另外,請小心應用程序服務的上一個結尾。你真的可以用這種方式阻塞某人的電話。真的,真的是徹底地測試它們。 – 2012-07-20 19:30:39

+0

有沒有辦法檢測服務是否已經啓動並運行?我想從一個活動中檢測到,如果它尚未啓動,它將啓動此服務。 – giga 2012-07-21 03:46:43

回答

1

好的,評論不夠大。以下是我用來啓動服務的一些代碼。啓動服務之後是一個函數,用於確定服務是否正在運行。 DownloadDatabase類擴展了IntentService。該服務下載一個由Android外部創建的70兆SQLite數據庫。

Intent intentService = new Intent(this, DownloadDatabase.class); 
startService(intentService); 

以下函數檢查服務是否已在運行。它被編碼爲一個函數,因爲我從其他例程中調用它來執行其他的驗證,如果沒有運行的話。

private boolean isMyServiceRunning() { 
    ActivityManager manager = (ActivityManager) getSystemService(ACTIVITY_SERVICE); 
    for (RunningServiceInfo service : manager 
      .getRunningServices(Integer.MAX_VALUE)) { 
     if ("com.hodsonssoftwarellc.nutritionexplorer.DownloadDatabase" 
       .equals(service.service.getClassName())) { 
      return true; 
     } 
    } 
    return false; 
} 

您還需要以下權限在您的清單:

uses-permission android:name="android.permission.GET_TASKS" 

什麼在isMyServiceRunning功能發生如下:

  1. 行爲管理取得。
  2. 檢索當前正在運行的任務列表,並將其用作循環特例中的參數。
  3. 由於每個任務都從列表中檢索,因此任務名稱將與我的完全限定的類名稱進行比較以用於下載服務。
  4. 如果找到匹配項,則函數返回true。否則它返回false。

所以,回答你的問題,是的,你可以檢查它是否從你的任務開始運行。即使您退出該任務並重新開始。您還可以檢查是否正在從不同的活動或應用運行。

注意:此代碼是爲2.x兼容性編寫的。如果您正在使用版本3或更高版本進行下載,請使用下載管理器,而不要編寫自己的下載服務。

+0

感謝您的回答。我會盡快發佈我的結果。 – giga 2012-07-22 08:03:06

+0

工作完美!非常感謝:) – giga 2012-07-22 08:23:21

+0

不客氣。 – 2012-07-24 00:15:29

相關問題