7

我有一個BroadcastReceiver類。我有一些聲明它的值在onReceive()方法中更新的靜態變量。根據我的知識,靜態變量將保持onReceive調用的值。有沒有可能,當我將失去這些價值(像我的班將被卸載重置靜態變量)?這些基本上是我需要用於多個onReceive調用的一些臨時變量。BroadcastReceiver生命週期 - 靜態變量

回答

4

BroadcastReceiver Lifecycle文檔...

一個BroadcastReceiver對象僅適用於調用的onReceive(上下文,意圖)的持續時間。一旦你的代碼從這個函數返回,系統就認爲該對象已經完成並且不再處於活動狀態。

這並不會使靜態變量的使用變得切實可行,因爲系統會快速清理事物。我會嘗試使用SharedPreferences致電...

context.getSharedPreferences("MyReceiver", MODE_PRIVATE)

...接收機的onReceive(...)方法(有一些名字這是有道理的,以您的應用程序替換"MyReceiver")。

+1

但靜態變量是類級變量,不應在對象銷燬時清除。如果我錯了,請糾正我。我知道getSharedPreferences(),但只是想使用靜態變量,因爲有些時候我需要在我的工作完成後清除這些變量,並且我不希望它們仍然存在於SharedPreference中。最後,如果它可以通過變量實現,然後我不想使用SharedPreferences。如果它不能那麼肯定我會去SharedPreferences。 – Sush 2011-06-10 05:27:03

+0

@Sush:「但是靜態變量是類級變量,當對象銷燬時不應清理。」 - 那麼當這個類的最後一個實例被銷燬時,'哪裏'類變量'存在'?他們不只是在網絡空間中等待另一個類的實例出現。正如從文檔引用中所解釋的那樣,當'onReceive(...)'退出時,系統認爲該對象被完成。基本上你不能保證是否/什麼時候'BroadcastRecever'對象將被GC'd。至於'SharedPreferences',你可以在不再需要時簡單地'清除'它們。 – Squonk 2011-06-10 15:31:13

+3

@MisterSquonk:我同意SharedPreferences可以完成這項工作。但是我堅決不同意,一旦類的最後一個實例被破壞,靜態變量就會被銷燬。當類被加載到內存時,靜態變量被初始化,當應用程序啓動並停留在內存中直到該類在內存中。它不依賴於對象的生活。 – Sush 2011-06-10 18:23:17

0

或者你當然可以在你的活動類中聲明靜態變量。

+0

是的,我可以做。但是在** BroadcastReceiver **中聲明靜態變量是否存在問題? – Sush 2011-06-10 05:39:51

+0

靜態變量在Activity,BroadcastReceiver或類中聲明並不重要。一個靜態變量的行爲相同。 – jclova 2014-12-04 16:08:36