2010-10-28 89 views
6

我有一項服務跟蹤用戶的位置。目前,服務在應用程序啓動時啓動,當應用程序終止時啓動。不幸的是,如果用戶將應用程序保留在後臺,服務將永不停止並耗盡電量。基於應用程序狀態停止並啓動服務

我希望服務在我的應用程序不在前臺時停止。我希望Application類能讓我Override onPause和onResume處理程序,但它沒有它們。有另一種方法可以完成這個嗎?

+0

當你說「你的應用程序不在前臺」時,你指的是一個與你的服務不同的活動(雖然是同一個應用程序的一部分,我敢肯定)? – Brandon 2010-12-04 19:32:40

+0

在服務的永無止境的循環中,添加一個檢查來查看你的應用程序是否在前臺。但是這將花費您清單中的'GET_TASKS'權限。 – 2013-05-25 18:53:14

回答

0

您應該覆蓋您的Activity上的onPauseonResume方法。如果你有多個活動,你可能想要爲它們設置一個公共基類,並將啓動/停止邏輯放入基類中。

+0

因此,您希望我的位置服務在每次進入新屏幕時停止並啓動?我不認爲這就是我要找的。 – Andrew 2010-10-28 19:06:32

+0

您可以在自己的應用程序中啓動活動時設置一個標誌,並且只有在未設置啓動自己的活動標誌時才停止服務。 – fornwall 2010-10-28 20:14:49

5

我還沒有測試過,但它看起來像是如果您使用Context#bindService()(而不是Context#startService()),服務應該停止時沒有更多的活動綁定到它。 (見Service lifecycle)。

然後在每個活動中使用onPause()/onResume()從服務綁定/取消綁定。

或者,您可以在服務中添加一對方法,告訴它開始/停止位置更新的偵聽,並從每個活動的onResume()/onPause()中調用它。該服務仍在運行,但位置更新不會耗盡電池。

+0

有趣。 onPause/onResume方法唯一的問題是,在啓動一個新的Activity時,當前的Activity暫停,然後重新開始新的Activity。因此,啓動新的活動將停止服務。不過,您的第二個建議可能會起作用。 – Andrew 2010-12-05 03:12:58

0

我還沒有嘗試過這種做法,但我認爲你可以通過使用KeyEvent.KEYCODE_HOME覆蓋Android設備的Home鍵,你可以使用stopService(Intent)停止你的服務,並在再次申請簡歷,你可以在的onResume寫startService(Intent)()方法的活動。

這種方式我認爲你的服務只會停止當用戶明確地按下主頁按鈕來在後臺應用程序,而不是當他從一個活動切換到另一個時。

-1

創建方法,在你的應用程序對象registerActivity()unRegisterActivity()和實施所有第一種方法,你的行爲onResume()和第二的行爲onPause()

第一種方法在您的應用程序對象中添加List<Activity>實例的活動,unRegisterActivity()檢查每次調用中的列表大小if==0 stopService();

+0

有趣,但這將如何工作?如果我啓動一個新的Activity,則前一個Activity的onPause()將在新Activity的onResume()之前執行。因此,計數將暫時爲0,並且每次啓動新的活動時服務都將停止。 – Andrew 2010-12-07 16:24:06

+0

你是否可以在handler.postDelayed(Runnable,500)中檢查大小;或足以讓所有活動暫停的延遲;試試這個,讓我知道 – asaad399 2010-12-07 17:54:08

+0

這個概念很好,但是向靜態應用程序實例添加活動引用是導致內存泄漏的最簡單方法。在你的註冊/取消註冊方法中增加一個計數器將是一個更好的方法,當計數器小於0時停止服務。 – 2014-04-10 13:40:56

1

閱讀上述所有的答案,我建議只需要添加一個布爾全局標誌爲每個活動&把它放在你的onResume &的onPause &也同時啓動一個活動像這樣的事情

public void onPause() 
{ 
super.onPause(); 
activity1IsResumed = true; 
} 

&同爲的onResume

&同樣發起新活動時

startActivityForResult(myintent ,0); 
activity2IsResumed = true; 
activity1IsResumed = false; 

然後在您的服務只需檢查

if(activity1IsResumed || activity2IsResumed || activity3IsResumed) 
{ 
//your logic 
} 
else 
{ 
//another logic 
//or dont run location tracker 
} 

&你做!

0

我會建議重寫onPause/onReume方法,正如其他人所說的。如果不瞭解更多關於應用程序和活動之間交互的流程,除了猜測之外,我無法提供更多信息。

但是,如果您的活動持續存在,我的建議是在活動之間切換時更好地利用意向。

例如,每個活動應該有一個布爾「轉換」標誌。所以,當你從一個活動移動到下一個,你設置了一個意向額外:

intent.putExtra("transition",true); 

隨後在接收活動是:(中的onCreate)

intent.getBooleanExtra("transition",false); 

通過這種方式,爲每個活動啓動後,您可以知道它是否來自其他活動,或者是否已從主屏幕啓動器啓動。因此,如果它得到真正的轉換,那麼onPause不應該停止服務 - 這意味着在返回後您將返回到先前的活動。如果它沒有收到額外的「轉換」或虛假的轉換,那麼你可以放心地認爲它下面沒有活動等待接管當前的活動。

在第一個Activity上,如果您切換到另一個Activity,您只需要停止該服務,如果一個Activity是從另一個Activity啓動的,那麼您應該能夠以編程方式找出它。

0

聽起來像真正的問題是如何才能停止服務,當你去一個不是你自己的活動?一種方法是在你的onPause方法中停止活動。爲你所有的活動做到這一點。然後覆蓋你的startActivity方法。在這裏做一個有條件的測試,以確認你有意識地導航到你自己的一個。如果你的標誌設置爲true。

現在回到您的暫停重寫方法。只有在標誌不等於真的情況下才停止服務。將該標誌設置爲false。

所有導航離開的事件將關閉您的服務。導航到你自己的將保持完好無損。

在基類中重寫所有活動的延伸。

Writeen in my andolroid。稍後將發佈ezaple。

0

嘗試使用綁定服務技術來完成此操作。

Bound Services | Android Developers

你可以在一個方式,使得在沒有活動必然給它的服務將停止使用綁定服務。這樣,當應用程序不在前臺時,服務將不會運行。當用戶將應用程序帶回前臺時,Activity將綁定到服務,服務將恢復。

相關問題