2013-11-15 26 views
0

運行應用程序時,靜態字段和其他存儲數據方式有什麼不同? 我使用活動之間傳遞數據靜態字段和完美工作:您可以在活動之間交換數據的另一種方法

我定義這個類:

public class Info 
{ 
    public static int ID  = 0; 
    public static String NAME = "TEST"; 
    public static TestClass testclass = null; 
} 

,我可以在任何地方存放我的數據:

Info.ID = 5; 
Info.NAME = "USER!"; 
Info.testclass = new TestClass(); 

可以和我得到我的數據在任何地方:

Info.ID 
Info.NAME 
Info.testclass 

回答

3

這是通常使用的意圖內額外活動之間傳遞數據。這些數據在接收活動的整個生命週期中持續存在(當完成時,垃圾收集器可以釋放內存)。

或者您可以使用SharedPreferences存儲值。這些將在會話之間持續存在,並作爲鍵/值對存儲在文件中(因此不會影響內存使用)。

或者您可以在靜態字段中持有值(如您在此處所做的),這些值在您的應用程序會話的生命週期中保持不變。但是,由於垃圾收集器無法釋放被這些字段引用的內存,除非在不再需要引用時將其設置爲null,否則存在重大風險。你永遠不應該在靜態字段中存儲一個活動/上下文/視圖的引用,因爲你會泄漏整個活動,這可能會導致大量的內存使用量。

http://android-developers.blogspot.fr/2009/01/avoiding-memory-leaks.html

您可以在意向中傳遞一個類的實例,如果它是序列化的,如:

Intent intent = new Intent(this, whatever.class); 
Bundle b = new Bundle(); 
b.putSerializable("data", my_object); 
intent.putExtras(b); 
startActivity(intent); 

以及接收活動,將它轉換回任何類的對象是:

Bundle b = getIntent().getExtras(); 
my_object = (whatever class is it) b.getSerializable("data"); 

許多Java類實現Serializable,並且使自己的類也可以很容易地被序列化。

+0

但我怎麼發送[calss]或對象數據到其他活動? – javadaskari

+0

請參閱我上面的修改。 – NigelK

0

您可以使用intent之間傳遞數據activi領帶。 你的第一個Activity.java

public void onClick(View v) 
    { 
     Intent timer = new Intent (FirstActivity.this,SecondActivity.class); 
     timer.putExtra("beefType", 5000); 
     startActivity(timer); 
    } 

然後在你的SecondActivity.java文件做:

nt beefType = getIntent().getIntExtra("beefType", -1); 
+0

我知道,我想知道您的解決方案和我的解決方案有什麼不同? – javadaskari

+0

很多不同你的靜態變量可以從每個類訪問,但我的不能。您也可以通過傳遞值來使用其他函數,如startActivityForResult()。 –

2

如果您要改變我假設你正在使用intent的活動。你可以做的是發送數據intentmyIntent.putExtra("some string",someString);

然後你就可以使用

Intent intent = getIntent(); 
String someString = intent.getExtra("some string"); 
+0

你對,但我的問題是不同的使用putextra和使用靜態字段? – javadaskari

+0

如果你的應用程序崩潰或者沿着這些行 –

0

你想活動之間共享數據接收新的活動信息,你可以使用意圖或共享prefernce。 使用這些拖拽和靜態數據的區別在於,在某些靜態數據中,意圖和共享優先權可能爲空或空。但使用上述兩種方法發送數據保證您將在下一個活動中獲取數據,除非您強制刪除偏好 你可以參考這個鏈接瞭解更多信息Static class in Java (Android) - use or not use

+0

但是我可以通過「if」處理空值或空值,它對'NullPointerException'更安全。我可以通過靜態字段在活動之間發送對象! – javadaskari

0

在android中有一種叫做Application Class的東西。它像一個全球性的單身人士。

  • 換句話說,該應用程序類對於整個應用程序來說是通用的。
  • 應用程序類將被加載的第一個類。

因此,將一些隨機使用的值存儲在應用程序類中會更容易。

Info info= ((YourApplication)this.getApplication()); 

而在你的清單:

public class Info extends Application 
{  
    public static int ID  = 0; 
    public static String NAME = "TEST"; 
} 

然後通過調用它的任何活動

<application 
android:name="<your package name>.GlobalApplication"> 

........ 
........ 

</application> 
+0

我爲什麼要使用應用程序?我想我不需要它。 – javadaskari

+0

它取決於你.................. – amalBit

0

那麼,這種方式並不總是在Android中工作。您的靜態值僅在您的應用運行時保持不變。想象一下,你正在與行動SEND共享一些內容,所以你開始另一個應用程序,實際上分享你的內容(Facebook,電子郵件等)。如果沒有足夠的資源啓動其他應用,Android可能會決定完全停止您的應用。在這一點上,你的應用程序的過程已經完全消失,並伴隨着你的靜態值。從共享內容的應用程序返回到您的應用程序時,您已經失去了自己的價值觀。

如果需要序列化更復雜的數據,我最好使用Intent extras,並結合Parcelable對象。

如果您在設備中啓用選項,則可以輕鬆嘗試。不要將活動保留在開發人員選項下,只要用戶離開活動,這些活動就會摧毀每個活動。

相關問題