2015-12-28 21 views
2

我已經閱讀了許多其他類似的問題,但似乎沒有解決我正在處理的具體問題。我的應用程序需要將數據從服務器同步到本地SQLite數據庫。但是,只有在用戶通過登錄活動登錄之後,才能開始此過程。登錄活動的其中一個選項是「記住我」,這意味着如果用戶關閉應用並重新啓動應用,應用將使用上次成功登錄時保存的憑證「自動登錄」。如果失敗了,那麼它會把他們帶到登錄活動。因此,這樣的解釋不會出現...數據的同步需要在後臺線程中完成,並且應用程序將繼續運行,同時數據在後臺進行更新。到目前爲止,我只是用一個異步任務,並推出類似的任務:如何正確管理Android後臺任務?

dataManager = new DataManager(); 
dataManager.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR); 

現在,這裏是我的問題就在用戶中選擇菜單選擇「退出」的能力。如果他們選擇了它,那麼它將把它們帶回到登錄活動。在哪裏,如果他們再次登錄我可能需要做到以下幾點:

首先,我必須檢測是否有已經DataManager的任務運行的實例。如果是這樣,並且用戶與以前登錄的用戶不同,則殺掉以前版本的DataManager任務並重新啓動它。

如果用戶是一樣的,如果以前的版本正在運行(或甚至已經完成運行),否則啓動它。

此外,如果用戶直接關閉應用程序,並重新推出它沒有Android已經殺死了任務之後我莫名其妙地需要檢測和處理,如果我要創建的DataManager與否的一個新實例。

我也可以從通知執行相同的後臺任務,所以我應該能夠控制停止和重新啓動任務應用程序服務器獲得推送通知。

最後還會有一個「刷新」菜單選項,當用戶希望他們可以選擇運行後臺任務(如果尚未運行)。

定期將數據更新到本地SQLite數據庫我希望能夠執行廣播來通知活動,他們可以通過對將受到影響的活動設置一個監聽器來「刷新」UI。

在努力總結整個問題....

你如何處理運行,停止,重新啓動和檢測的後臺任務的單個實例的狀態?

+0

你看過otto還有http://square.github.io/otto/嗎? – Victory

+0

我快速查看了otto,但無法看到它對我的問題的相關性。 –

回答

-1

Content Provider,SyncAdapter和AccountManager爲您解決了這個問題。 (我寫了這個,但是從素不相識的人的回購拉,因爲它是一個MOOC分配,我的版本是不公開的,但是......還是我的名字在@author -_-)

AccountAuthenticatorService

LoginActivity

ContentProvider

ContentProvider SyncAdapter

我個人的意見是,你永遠不應該-not-有內容提供商包裹你r SQLite數據庫,但如果您使用互聯網來同步數據,這肯定是真的。 (請注意,「內容提供者」不必公開共享,因爲許多新的android開發人員認爲。)

SyncAdapter服務/管理器將允許您輕鬆安排後臺同步和/或按需同步。這樣做的好處是您的應用程序不必一直運行服務或線程。如果需要,您可以使用SyncManager手柄啓動SyncAdapter服務。這可以節省用戶設備的電池壽命,並且有助於清晰地描述項目網絡代碼等應該去的地方。