1. 程式人生 > >Android使用static定義全域性變數被系統回收的問題

Android使用static定義全域性變數被系統回收的問題

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重啟之後,再進行資料的初始化。