2016-09-17 50 views
0

我正在製作一個應用程序,使用ActivityRecognition API在後臺跟蹤用戶活動,並且如果用戶在指定的時間段(例如1小時)內保持在同一地點,則系統將通知告訴用戶去散散步。我已經實現了活動識別,但僅限於應用程序打開時的情況。顯然,Google API客戶端需要保持連接才能發送活動更新。我的問題是 - 對於後臺的活動跟蹤,什麼是更好的解決方案:背景中的活動識別

1)要在主要活動(或單獨活動)中實施AlarmManager,以便在30秒內喚醒活動,請將Google API Client連接到Play服務,然後將PendingIntent發送到IntentService以進行活動分析

2)創建單獨的Service(而不是IntentService)以在後臺(獨立線程)上持續運行,這將保持API Client連接,並將活動更新發送到IntentService。因此,該系統將有2項服務:1)將API客戶端連接到Play服務並定期向IntentService發送更新以進行分析的服務; 2)IntentService用於接收來自Service的活動更新並分析數據。

3)其他的一些解決方案(由你們提供)

評論:我的導師建議我使用AlarmManager,但您通常使用的東西像網絡更新,因此間隔一般在10分鐘以上,而我需要30秒 - 1分鐘。所以我猶豫使用它。

我也在這裏看到過很多類似的問題,但我還沒有找到明確的答案。

+0

你有沒有考慮過使用Geofences或使用喚醒鎖監控加速度計? – Veener

+0

類似於http://stackoverflow.com/questions/28380527/detect-phone-movement-when-screen-is-off的問題 – Veener

回答

3

實際上,連接GoogleApiClient僅用於請求和刪除活動更新 - 您不需要連接GoogleApiClient來接收活動更新

requestActivityUpdates() documentation實際上特別提到的工作的背景:

一個常見用途的情況是,一個應用程序要在後臺監控活動,並在檢測到特定活動時執行的操作。要做到這一點而不需要始終處於耗費資源背景的服務,檢測到的活動將通過意向傳遞。應用程序指定一個PendingIntent回調(通常爲IntentService),當檢測到活動時,將使用意向調用該回調。意向收件人可以使用extractResult(android.content.Intent)提取ActivityRecognitionResult。有關更多詳細信息,請參閱PendingIntent的文檔。

+0

因此,如果我在主要活動中連接Google客戶端,並從那裏實施連續發送PendingIntents的方法IntentService與活動數據,這是否意味着它仍然會繼續發送數據到IntentService,即使在主活動本身被銷燬後?另外數據的接收者應該如何實現:作爲一個廣播接收者的正常活動,或者我應該將結果提取到IntentService本身中?對不起,我在堆棧溢出中發佈了與類似問題有關的太多帖子,在這一點上,各種各樣的答案讓我感到非常困惑。 – Gideon

+0

@Gideon - 是的,即使在主要活動被破壞後,您仍會繼續收到活動更新。遵循來自文檔的建議並在IntentService中使用'extractResult'在絕大多數時間都是正確的選擇。 – ianhanniballake

+0

還有一個問題,在創建客戶端對象並請求活動更新後,如果我們退出應用程序,從而銷燬客戶端對象,並再次打開它以刪除活動更新,那麼我們創建並提供給系統的新客戶端對象remove activity更新方法需要與我們爲請求更新而創建的對象相同,換言之,客戶端對象是否需要某種類型的id,以便系統將刪除特定客戶端對象的更新;或者對系統無關緊要,只要我們提供任何客戶端對象? – Gideon

0

我會推薦一種不同的方法。 Google活動識別API存在的問題是,您無法確信它會報告某個事件,直到其置信度> 75。要獲得> 75的置信度,您需要增加檢測級別,這反過來會消耗大量電池。我建議嘗試一些免費的SDK,比如Atooma,tranql或者Neura(你可以在網上找到它們)。這些給你更好的洞察你的用戶,並在某些情況下,只消耗大約1%的電池壽命