2013-04-04 73 views
0

只要Android設備處於打開狀態,我想在後臺運行服務。我已經有了一個廣播接收器,在監聽BOOT_COMPLETED以確保它在它應該的時候開始,並且它確實如此。但是當主要活動開始時,我想確保服務仍在運行,如果沒有,請重新啓動服務。我很早就開始接觸服務,所以我不確定我是否做得對。確定服務在啓動時是否正在運行,因爲它是自己的進程?

清單中的服務被定義爲

<service 
    android:name="MyService" 
    android:icon="@drawable/myicon" 
    android:label="MyServiceLabel" 
    android:process=":my_process"> 
</service> 

它正在從廣播接收器使用

public void onReceive(Context context, Intent intent) { 
    Intent service = new Intent(context, OgLogService.class); 
    context.startService(service); 
} 

我的服務的肉開始是

public int onStartCommand(Intent intent, int flags, int startId) { 
    Timer t = new Timer(); 
    t.scheduleAtFixedRate(new TimerTask() { 
     synchronized public void run() { 
      // call web service, do stuff 
     } 
    }, 0, 1000 * 60); 
    return Service.START_STICKY; 
} 

@Override 
public IBinder onBind(Intent arg0) { 
    return null; 
} 

將這項服務逗留無限期地或OS可以關閉它?如果它關閉了,我的活動如何說明?如果我的活動確實需要重新啓動服務,那麼是否需要採取特殊的方式來確保它是一個單獨的進程,當主要活動消失時不會死亡?對於有這麼多問題感到抱歉,我只是覺得在他們自己的流程中(以及一般的服務)有點誤導了服務。我讀過的所有內容都是關於服務不在他們自己的過程中

我問,因爲有一次我相信我有多次運行的服務。服務和活動不直接相互作用。該服務寫入活動讀取的同一個數據庫。有一次,似乎信息被複制到數據庫中,我認爲這是由同時運行的多個服務實例引起的。

我試過使用this answer中的代碼,但它似乎不適用於在不同進程中運行的服務。在系統設置>應用程序>運行中,它顯示我的應用程序運行1個進程和1個服務(由broadcastreceiver啓動),但isMyServiceRunning方法返回false,並逐步通過它似乎沒有列出我的服務。

回答

1

不保證您的服務能夠繼續。基本上你必須預料會被殺,然後重新開始或殺死。另一件事,除非你是音頻播放器,你不需要一直熬夜。如果你需要一直做連續工作,那麼你可能會忘記移動環境是多麼有限(電池等)。如果你需要這樣一些重複的任務,那麼我建議去AlarmManager在給定的時間或間隔觸發工人,並使用IntentService來實際完成這項工作。

+0

我的服務純粹是在設備開啓的整個過程中定期執行某些操作。 AlarmManager能否可靠地做到這一點? AlarmManager讓我想起鬧鐘設置的鬧鐘,比如早上醒來。它與這些警報有什麼關係? – 2013-04-04 18:31:36

+0

是的 - 你的名字錯了。這基本上是爲了這個目的。鬧鐘是由時間驅動的事件。就像「每5分鐘跑一次」或「在15:40跑我」。因此,引導接收器應設置第一個警報,然後警報處理代碼將設置下一個警報(或者您只需將其設置爲循環警報 - 取決於您所需)。請參閱http://developer.android.com/reference/android/app/AlarmManager.html上的AlarmManager文檔 – 2013-04-04 18:35:24

相關問題