2015-04-05 118 views
0

我正在設計一個在Android上使用NFC的應用程序。讀取標籤時,系統會發送一個Tag對象。 Tag對象是Parcelable對象。由於我想根據用戶設置稍後寫入該標籤,因此我需要以某種方式「緩存」該對象。我雖然使用粘性廣播稍後檢索它,但從棒棒糖開始,粘性廣播已棄用。另一種方法是保存在磁盤上,但正如文檔所述,保存Parcelable並不是件好事。我猜如果我緩存對象的文件,用戶更改Android版本,標籤對象不同,然後可能發生崩潰,就會發生問題。我只需要一個內存緩存,但在我看來,無法強制Android保留內存緩存,我可以使用粘性服務,但Android可以隨時終止我的服務。這種情況下最好的方法是什麼?可緩存對象緩存

+0

你是否真的需要這樣一個強大的持續不斷的堅持爲你的標籤對象? :) – agamov 2015-04-05 09:58:02

+0

「因爲我想寫在這個標籤後面」 - 人體模型或綁架人質以外,大多數用戶會移動。 NFC標籤本身將被取出Android設備的範圍。即使用戶稍後將標籤移回範圍,結果也將是「標籤」的另一個實例。因此,一個'標籤'只會對一秒鐘左右有用。 – CommonsWare 2015-04-05 10:28:24

+0

@CommonsWare是的,但我不談論幾個小時。即使5秒鐘也是一個問題,因爲我無法將「標記」對象傳遞給「周圍」。正如我所說我可以使用一項服務,但我沒有獲得任何服務保留的授權,我可能會丟失標籤對象。 – greywolf82 2015-04-05 14:59:52

回答

2

當標籤被讀取時,系統發送一個活動一個標籤對象。

正確。而且,在這一點上,這個活動和你的過程處於前臺。我們稍後會回到這一點。

因爲我想以後寫一篇關於這個標籤

沒有「後來」的意義。您等待的每毫秒是用戶有機會將設備移出標籤範圍的毫秒,此時Tag對象無用。即使用戶稍後將設備移回標籤範圍,您也會得到一個新的Tag對象。

根據用戶設置,我需要以某種方式「緩存」這個對象。

不是。你只需要通過Tag來滿足任何需求。它是一個Java對象,所以它可以作爲參數傳遞給你需要的方法。它是Parcelable,所以你甚至沒有受到Intent的限制,因爲你可以將Tag加入Intent

連5秒鐘都出了問題

是的,只要用戶可能是由然後移動他們的設備從標籤了。

因爲我無法傳遞Tag對象「around」。

是的,你可以,因爲它是一個Java對象 - 請參閱前面的答案。

我需要一個內存緩存僅僅幾秒鐘

五秒鐘,靜態數據成員將工作得很好。

但Android不提供任何工具來保持內存緩存

靜態數據成員在Android的工作就像在普通的Java靜態數據成員。

我的猜測是你擔心你的進程被終止。正如本答案的頂部所指出的那樣,在您獲得Tag時,您的過程具有前景重要性。直到用戶執行某些操作(例如,按HOME)才能將應用程序移動到後臺,它不會被終止。您的後臺進程有可能會在五秒內終止。但是,如果用戶決定離開您的應用程序,這將是一個信號,表示用戶不希望您再使用NFC標籤。

歡迎您使用服務來嘗試增加您的流程在五秒鐘內存活的機率。在這一點上,它是更可能是用戶將在這五秒鐘內從標籤中刪除他們的設備,而後臺進程將在相同的五秒內終止。個人而言,如果我試圖編寫使用NFC並且可靠的應用程序,我會立即在收到後立即寫入Tag。延遲意味着應用程序的可靠性將下降,更多的是由於用戶操作而不是由於進程被終止。

+0

你的回覆是正確的。由於我爲其他應用程序編寫插件,所以我不能依賴額外的意圖,或者至少我可以使用服務作爲「臨時存儲」,因爲我需要兩個步驟的過程,這是一個漫長的故事:)。然而,我同意你的看法,這是一種黑客行爲,NFC安卓管理告訴你:使用前臺活動來寫! :)謝謝你的迴應。 – greywolf82 2015-04-05 15:28:42

+0

@ greywolf82:「因爲我爲另一個應用程序編寫插件」 - ick。在那種情況下,是的,我猜靜態數據成員方法和你將要獲得的一樣好。但是,再一次,我擔心用戶離開標籤比我擔心流程消失更多。用戶很容易感到無聊。 :-)我的答案讓我有點不安,但插件場景很少見,並沒有超出我的想法。 – CommonsWare 2015-04-05 15:33:53