2010-11-24 65 views
1

我是一個android noob,正在尋找一些關於如何在Android中正確使用服務的建議。我正在構建一個應用程序,該應用程序將連接到Internet上的服務器以通過TCP獲取數據流。該數據然後需要發送到另一個通過藍牙串行端口連接的設備。我希望這可以在用戶查看不同的活動時在後臺繼續運行。Android服務設計 - 從活動開始還是僅在需要時開始?

該應用程序將是一個NTRIP客戶端,它從互聯網上提取實時RTK校正數據,並將其發送到我通過藍牙連接的RTK GPS接收器。數據速率將約爲500字節/秒。用戶界面是一個單獨的按鈕,用於連接或斷開數據流和一些文本以顯示GPS接收器的狀態。還有一些設置需要用戶配置,例如要連接的服務器的IP /端口和藍牙設備進行通信。

我認爲我需要讓主要活動產生一個本地服務,然後讓服務爲TCP流創建一個線程,爲藍牙連接創建另一個線程。這聽起來正確嗎?

這種情況下服務的最佳模式是什麼?

- 每次活動開始時啓動(綁定)服務,並使連接/斷開按鈕向服務發送命令以啓動/停止線程。如果我走這條路線,服務將在用戶斷開連接並轉到另一個應用程序後繼續運行。該服務需要一個不活動計時器來終止自己。

- 當用戶按下連接/斷開按鈕時開始並停止服務。該服務僅在數據移動時運行。如果我這樣做,活動將需要查看活動開始時服務是否正在運行,以便知道它是否應綁定到服務或告訴用戶鏈接已斷開。

謝謝。

回答

1

我想你的第二個選擇。檢查服務是否正在運行是一件容易的事情,也不會消耗不必要的處理時間,這對電池壽命會更好。

僅僅因爲您可以在後臺長時間運行服務並不一定意味着您也應該這樣做。至少不是所有的時間。

0

由於android支持多個入口點進入應用程序,因此您可以在Manifest.xml中定義兩個入口點。 <category android:name="android.intent.category.LAUNCHER" />定義,這個類可以從啓動程序啓動。我想這也適用於服務。我會做兩個入口點。一個首先產生活動並給用戶一些配置控制。另一種簡單的產生服務。

由於您無法控制一個活動的生命週期,我不會建議做任何不該由系統結束的事情。如果您有來電,您的活動就會消失。 如果用戶啓動服務,您可以使用按鈕創建一個小部件。如果用戶開始活動,您可以啓動服務和小部件。 如果用戶啓動小部件,用戶決定,該服務應該發生什麼。

+0

部分錯誤,其他部分完全混淆不清,甚至可能錯誤。 – 2010-11-24 22:17:19

0

我不是一個Java或Android程序員,所以拿一點鹽來說吧。在Java中處理阻塞IO的正常方式是使用線程。這聽起來像數據流是單向的,但爲了獲得最大的靈活性,我會創建3個線程,一個用於UI,一個用於TCP連接,一個用於藍牙連接。UI和兩個工作線程之間的通信可以使用共享變量完成(需要注意同步,競態條件等)。我會使用多線程隊列數據結構將數據NTRIP數據傳遞給其他工作人員。

的NTRIP數據的工作線程將大致爲:

while (app running) { 
    if (connection enabled) { 
     if (not connected) { 
     c = connect to remote 
     } 
     data = get data from c 
     queue.put(data) 
     if (options reconfigured) { 
     close c 
     } 
    } 
} 

對於藍牙螺紋:

while (app runnning) { 
    data = queue.get() 
    if (UI settings changed and connected) { 
     close connection 
    } 
    if (not connected) { 
     c = connect to remote 
    } 
    send data over connection 
} 

在正常狀態下,無論是工人阻塞IO和將主要消費沒有CPU時間。根據我的經驗,我建議您編寫代碼來處理通信錯誤。爲了讓你的代碼在現實世界中運行良好,你必須處理關閉,掛起等連接。使它強大可能是開發中最耗時的部分。