2012-10-19 50 views
3

我在Service和BroadcastReceiver之間產生混淆。我正在開發基於位置的應用程序。在這種情況下,每當他/她的位置發生重大變化時(例如10米),我都希望將用戶的位置存儲到數據庫中。頻繁獲取和存儲位置有哪些好處 - 服務或BroadcastReceiver?

我正在使用LocationListener,它工作正常。但是我的困境是:在哪裏編寫onLocationChanged()方法 - 在BroadcastReceiver的onReceive()方法中還是在Service中?

如果我正在使用服務,那麼在哪種服務方法下,我應該寫下面的代碼?

這裏是我的位置監聽器:

LocationManager locationManager = (LocationManager)getSystemService(Context.LOCATION_SERVICE); 

    LocationListener locationListener = new LocationListener() { 
     public void onLocationChanged(Location location) { 
      if(location != null){ 
       //Code to populate location-data into the database table. 
      } 

     public void onStatusChanged(String provider, int status, Bundle extras) {} 

     public void onProviderEnabled(String provider) {} 

     public void onProviderDisabled(String provider) {} 
     }; 

    locationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 5, 10, locationListener); 

任何人都可以請建議我是什麼來實現它的更好的辦法?我已經閱讀了關於Service和BroadcastReceiver的所有Android開發人員文檔,但是我仍然無法區分它們的用法?

回答

1

在我看來,這取決於你想做多少工作。

如果您想在收到廣播時做一些小事,那麼您可以在BroadcastReceiveronReceive()方法中執行此操作。但是,在主應用程序線程上調用了onReceive()。所以,如果Android操作系統需要很長時間,它會殺死它。

因此,如果你想做一些可能需要一段時間的事情,你應該在後臺線程中使用Service。正如所建議的,您可以將您的代碼放在服務的onStart()方法中。如果它沒有做任何事情(電池和其他資源的腰),不要保持服務運行。每次收到廣播時開始服務,並在完成分配的作業後儘快完成。

P.S. Mark L. Murphy(又名CommonsWare)有幾本關於Android開發的優秀書籍。 Google繁忙編碼器指南Android開發。

UPDATE:

關於你的願望,取消後臺任務,當你的應用程序切換到後臺。

考慮一下如果後臺任務在中間被中斷,你會怎麼做。你需要處理這種情況。如果您確定,那麼您可以使用AsyncTaskService在後臺完成您的任務。你的選擇又取決於你的任務的大小和類型。

AsyncTask通常用於執行後臺操作並在UI線程上發佈結果。 Android文檔suggestsAsyncTask的任務不應超過幾秒鐘。另一方面,Service被設計來執行長時間的操作而不與UI通信。

關於取消。當您的活動完成時,AsyncTask將被取消,因爲它對UI線程感到厭倦。要停止服務,您需要從您的活動中撥打stopService()

,因爲你需要頻繁地存儲位置信息,您可以在活動開始時,啓動服務,它利用該服務的onBind()方法進行通信,然後在你的活動onPause()方法停止服務。

+0

Thanx Nikolai,它的一個很好的解釋。那麼你是否試圖說我應該把上面的代碼放在後臺線程中,例如AsyncTask? –

+0

取決於)))是否要確保設備在服務運行時不會進入睡眠狀態?這不是一件好事(你應該讓操作系統進行電源管理),但是如果你確信這項服務是必不可少的...... –

+0

我希望我的服務只在我的應用程序處於前景時運行。如果該應用在後臺運行,我會停止此服務。這很好嗎? –

2

這取決於你的目的。如果您想在後臺捕捉位置,請在服務中使用。

BroadcastReciever的onReceive方法只會在您註冊接收什麼操作時纔會調用。

如果您想在前臺執行操作,您可以簡單地在活動中使用它。但是當你的活動結束後,你無法獲得地點。

所以,你根據你的功能來決定。

+0

+1。那麼在一個服務中,我應該用哪種方法編寫上面的代碼? –

+0

在onStart方法中編寫代碼。不要忘記完成服務。它將繼續運行,直到你調用finish()方法。 – Guna

+0

我應該在哪裏完成服務?在每一個活動? –

2

服務用於在後臺運行您的代碼,主要用於下載,音樂播放..用戶將應用程序放在後臺(按下home或back按鈕)後。 BroadcastReceivers用於接收通過sendBroadcast()方法發送的消息,並用來捕捉系統通知,如藍牙,網絡可用性,從其他應用程序獲得的消息...

我想你想在這裏使用服務,因爲BroadcastReceiver不禁如果應用程序在後臺,您可以收聽位置更改。

+0

但我想只在我的應用程序在前臺時做上述事情? –

+0

這取決於你真正想要什麼..我不建議你保持服務一直運行,因爲位置池是一個非常好的方式來排除設備電池.. – Cata

相關問題