只要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,並逐步通過它似乎沒有列出我的服務。
我的服務純粹是在設備開啓的整個過程中定期執行某些操作。 AlarmManager能否可靠地做到這一點? AlarmManager讓我想起鬧鐘設置的鬧鐘,比如早上醒來。它與這些警報有什麼關係? – 2013-04-04 18:31:36
是的 - 你的名字錯了。這基本上是爲了這個目的。鬧鐘是由時間驅動的事件。就像「每5分鐘跑一次」或「在15:40跑我」。因此,引導接收器應設置第一個警報,然後警報處理代碼將設置下一個警報(或者您只需將其設置爲循環警報 - 取決於您所需)。請參閱http://developer.android.com/reference/android/app/AlarmManager.html上的AlarmManager文檔 – 2013-04-04 18:35:24