2013-05-15 34 views
2

我正在寫一個應用程序,需要每分鐘註冊實際位置,無論是在前臺還是後臺。當用戶決定停止跟蹤時,我想收集收集的所有數據並使用它們。後臺服務與數據供以後使用最佳實踐

爲此,我想到了一種架構,它試圖節省電池,並儘可能提高效率。我想知道我的選擇是否足夠體面。這裏是:

  1. 我從一個Activity通過startService()啓動一個服務S.該服務將構建一個數據結構以保存數據供以後使用。活動和服務之間的通信也將通過Messenger對象創建。

  2. 我註冊將被接收機R.來管理它會是這樣的位置更新:

    this.lm= (LocationManager) getSystemService(LOCATION_SERVICE);   
    Intent locationIntent= new Intent(getApplicationContext(),TravelPosition.class); 
    PendingIntent locationPendingIntent= PendingIntent.getBroadcast(getApplicationContext(), 0, locationIntent, PendingIntent.FLAG_UPDATE_CURRENT); 
    lm.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 7000, 1, locationPendingIntent); 
    
  3. 每次接收器R的觸發,它將與服務S.溝通我正在考慮一個startService(Intent),我將座標放在Intent的extras中。

  4. 服務S將在其內部數據結構中存儲新數據(我的新位置座標和其他信息)。無論應用程序是在前臺運行還是在後臺運行,一切都應該起作用

  5. 一旦用戶通過活動中的按鈕停止跟蹤,後者將與服務進行通信以獲取存儲的數據,然後調用它stopService

您對此有何看法? 還有一個額外的問題:如果用戶想要殺死應用程序,接收器會發生什麼?它會打開應用程序嗎?

回答

2

首先,你是正確的思維架構通過前開始寫代碼:)

其次,我建議閱讀以下鏈接:

http://developer.android.com/guide/topics/location/strategies.html http://devdiscoveries.wordpress.com/2010/02/04/android-use-location-services/

三,你的情況,您不需要服務S.您可以註冊接收器R,並在接收器R中完成您所需的一切(包括處理和保存數據)。在這種情況下,如果您退出應用程序,您仍然會繼續接收位置更新。

+0

很酷,感謝您的鏈接(特別是第一個!) – Bertuz

+0

因此,回顧一下:我在某處(在我的活動中)創建了一個BroadcastReceiver並註冊了它。之後,我可以訪問它,這要歸功於我保存的一個簡單參考,並在我不再需要時取消註冊。對? :-) 只是爲了我的好奇心:我可以首先想到更重/更復雜任務的架構嗎?有沒有一個好的場景,我最好在接收器上使用服務? – Bertuz

+0

這是正確的。在cae中,如果您需要進行繁重的工作,那麼您可能應該創建一個服務並創建工作線程以便在此服務中處理。主要原因是不阻止(因爲我記得Receiver不會被第二次調用,直到第一次調用沒有完成)。 –