標籤:
Android資料共用
在Android應用程式開發的過程中,藉助Bundle類對象來傳遞資料並不是在所有情境下都適用,就那簡單的Intent類對象來說,就不能put進Bundle類對象中。當然不能否認,用Intent類對象來開啟另一個Activity或者Service,並利用Bundle類對象來攜帶資料是個不錯的形式,而且用途非常廣泛,但不是萬能的。
關於在程式中共用資料,方法有很多,下面來看看到底有哪些是比較常用,哪些又是比較符合物件導向和高效、安全的。
1、SharedPerferences
首先來看在同一個Moudle中的兩個檔案(Activity介面)之間進行資料的共用。在分享資料的主類MainActivity的重載方法onCreate()中添加以下代碼。
1 SharedPreferences shareData = getSharedPreferences("shared_data",MODE_WORLD_WRITEABLE);2 SharedPreferences.Editor se = shareData.edit();3 se.putString("shared_data1", "Hello World");4 se.commit();5 Intent intent = new Intent(MainActivity.this,GetData.class);6 startActivity(intent);
可以看到,在擷取共用對象時指定了此次進行的共用標示("shared_data")與模式(MODE_WORLD_WRITEABLE),這個非常重要,前者作為其他地方構建共用對象的唯一標示,後者作為決定當前共用對象的讀寫入模式。後面的Editor類對象主要完成了向共用對象中載入需要共用的資料,是以Key-Value的形式,這裡只載入了一對資料(”shared_data1”-”Hello World”,Value的類型任意)。最後調用commit()方法進行提交後,在另外的Activity中即可進行共用資料的提取了。
下面給出擷取資料類GetData的onCreate()方法中做了哪些事。
1 SharedPreferences shareData = getSharedPreferences("shared_data",MODE_WORLD_READABLE);2 getData = (TextView)findViewById(R.id.get_data);3 getData.setText("shared_data1 = +shareData.getString("shared_data1", "default"));
很簡單,利用共用對象直接調用getString()方法就可以通過Key來擷取Value。
但是問題來了,SharedPreferences.Editor類對象在載入資料時和Bundle類似,也是通過putType(Key, TypeValue )的形式,如果Type為Intent還是無能為力。
2、Bundle
Bundle類是結合Intent類一起使用的,下面給出簡單的例子。啟動另一個Avtivity時設定Bundle類對象。
1 Bundle bundle = new Bundle();2 bundle.putString("Key", “Value”);3 Intent intent = new Intent(MainActivity.this, OtherActivity.class);4 intent.putExtras(bundle);5 startActivity(intent);
在OtherActivity類中擷取資料:
1 Bundle bundle = this.getIntent().getExtras();2 String value = bundle.getString("Key");
3、封裝
將共用資料的聲明完全和使用檔案分開,將耦合度降到最低,方法是將需要共用的資料全部聲明在專門的一個類中。本來打算給出全部資料變數聲明為靜態變數的類中,考慮到和接下來將要給出的形式類似,而且從專業和安全性的角度不如後者,所以略過了。繼承Application類來聲明共用資料,並提供設定和提取資料的介面。
1 public class ShareData extends Application { 2 private int shareData1; 3 public int getData1() { 4 return shareData1; 5 } 6 public void setData1 (int shareData1) { 7 this. shareData1 = shareData1; 8 } 9 }
如果有多個資料,那麼相應的設定和提取方法也要實現多個,有興趣的小夥伴可以採用泛型的複用寫出更加簡潔的代碼。注意,類SharedData中的方法(目標是資料)在整個工程的類中都是可以訪問的,方法如下。
1 int shareData1 = ((ShareData)getApplicationContext()).getData1();
那麼重點來了,如果在類中聲明一個Intent類的對象,很幸運的是用法和int型相同,那麼就解決了其在不同檔案之間的共用問題。之所以總是以Intent類對象來說事,是因為在某些情況下確實需要用到這個方法。如在繼承Service類的子類中是不能直接利用startActivityForResult()方法的,自然就不會有重載onActivityResult()方法的機會,但是又要在該子類中利用onActivityResult()方法返回的Intent類對象。現在好了,可以將需要開啟的Activity放在可以重載onActivityResult()方法的類(比如主類)中去實現,同時將返回的Intent對象賦給ShareData類中Intent類對象,然後,就OK了。
Android資料共用