Android使用static定義全域性變數被系統回收的問題
阿新 • • 發佈:2019-01-05
AppConstants.java
public static String AppPay = "AppPay"; public static String AppPay_AccountPay = "/AccountPay"; public static String AppPay_TencentPay = "/TencentPay"; public static String AppPay_AllinPay = "/AllinPay"; public static String AppPay_VCardPay = "/VCardPay"; public static String AppPay_GetPayHistory = "/GetPayHistoryByUserId"; public static String AppPay_OrderConfirm = "/OrderConfirm";
大家在開發Android應用的時候,應該會有沿用java的習慣,用static定義一些全域性的變數。可是Android對程序和記憶體管理不同於PC的核心——如果資源足夠,Android不會殺掉任何程序,另一個意思就是程序隨時可能會被殺掉。而Android會在資源夠的時候,重啟被殺掉的程序。也就是說靜態變數的值,如果不做處理,是不可靠的,可以說記憶體中的一切都不可靠。
網上很多文章說用Application來儲存一些全域性變數,這個方法經過我嘗試之後,發現還是會被清空。怎麼辦呢?
當我快絕望的時候,忽然想起一個方法onSaveInstanceState()!我們可以覆寫Activity的onSaveInstanceState()方法,儲存當前頁面的一些資料,在程序被摧毀之後,重新回到頁面的時候,在onCreate(Bundle savedInstanceState)中的savedInstanceState取到儲存的資料。本以為這樣就可以解決問題了,但是想想之後,發現不可能每個頁面都去儲存一大堆變數。
最後我想到java的反射機制,可以為成員變數賦值,因為當應用的程序被系統摧毀之後,再回到應用,Application會重啟,執行onCreate()方法,所以我就在onCreate()裡呼叫
public void initAppData(){ try { Class<?> clazz = AppConstants.class; //獲取這個類所有的成員變數 Field[] fields = clazz.getDeclaredFields(); for(Field field : fields) { Object appConstants; //得到一個例項 appConstants = clazz.newInstance(); field.set(appConstants, field.get(field.getName())); } }catch (InstantiationException e) { e.printStackTrace(); }catch (IllegalArgumentException e) { e.printStackTrace(); } catch (IllegalAccessException e) { e.printStackTrace(); } }
Application重啟之後,再進行資料的初始化。