2014-02-24 39 views
1

在我的應用我有一組數據 - Definition(主要是StringsEnums和標誌 - 即沒有大),其動態(即不能被硬編碼到服務行動)定義IntentService如何處理其輸入。的Android:保持在RAM中的數據,而不會影響電池壽命

我的基本問題,是因爲它不是從他們的XML文件中的每個一個Intent傳遞給Service時加載這些Definition結構,我想保留在內存中(因爲它們規模小,快速訪問是導致需該服務經常被調用)並且使用坐在RAM中的Definition來處理Intents,因爲Service接收它們。

從邏輯上講,我能想到的是一個永久背景Service,有大量的消息來源說這是一個壞主意(我同意)。我猜基本上我想要的是一種將這些數據存儲在RAM中直到需要的方式(如Android系統用於打開應用程序,啓動器等的系統)並且不會對電池壽命產生任何不利影響(即, Service確實沒有沒有任何但在RAM中保存數據直到被調用),但是隻要我的Service被調用就可用?

是否有任何可能的方式,這可以實現,或者是唯一的選擇永久Service,我必須非常小心地管理?

如果永久Service是答案,將一個IntentService(配置爲START_STICKY)只是坐在RAM,直到它傳遞一個Intent不影響電池壽命?

+2

在android中沒有這樣的東西作爲一個真正的永久後臺服務。請記住,它首先是一部電話,因此任何包括前臺服務在內的服務都可以在電話鈴響起並且內存不足時終止。這種設計是故意的,否則服務可能會佔用所有內存,而您的手機會變成智能磚。 – Namphibian

+0

好點,我想我只是在腦海中永久性地緩存幾KB的手機內存以延長使用時間,以換取快速響應,似乎是一個值得的折衷。但是我認爲,如果所有的應用都這樣做了,那麼「自私」的方法並不是全面適用的。 –

回答

1

我的基本問題是,每次將Intent傳遞給Service時,都不是從XML文件中加載這些Definition結構,而是希望將它們保存在內存中(因爲它們小而快速由於該服務經常被調用),並使用駐留在RAM中的定義來處理服務接收到的Intents。

首先,「服務被頻繁地調用」表明,根據「非常頻繁」的定義,您可能已經在CPU和電池利用率方面對用戶造成了痛苦。該磁盤I/O的額外電池成本相比之下將是最小的。

除此之外,歡迎您在靜態數據成員中持有這些數據。只要你的過程在附近,它們就會在你身邊。取決於設備正在進行的操作,根據您「經常」的定義,這些數據可能會在下次調用您的服務時提供給您。如果不是,您只需從磁盤重新加載。換句話說,使用靜態數據成員作爲緩存。

從邏輯上講,我能想到的是一個永久性的後臺服務,其中有大量的消息來源說這是一個壞主意(我同意)。

具體而言,磁盤I/O的增量電池成本不值得一直捆綁用戶的RAM。

+0

感謝您的回答@Commons。我的「非常經常」使用使得它聽起來更戲劇化,然後我的意思是我想。該服務由用戶打開一個「快捷方式」調用,因此只有在他們明確請求它時纔會運行。一個關鍵的要求是我希望完成此操作的速度儘可能快 - 因此是緩存。我認爲根據你的答案,只要'Android自然而然地允許'靜態成員,'服務'就是最好的主意。 –

+1

@BT:「該服務是由用戶打開快捷方式調用的,因此只有在他們專門請求時纔會運行」 - 更不用擔心磁盤I/O的原因。 「一個關鍵的要求是我希望完成此操作儘可能快 - 因此是緩存」 - 當您運行性能測試時,要確定磁盤I/O實際需要多長時間,您學到了什麼? 「只要'Android自然而然地允許'與靜態成員聽起來像是最好的想法一樣,服務就是這樣。」 - 那就是你的'IntentService'。 – CommonsWare

相關問題