2012-12-20 37 views
1

我創建了兩個共享相同用戶標識(sharedUserId)以及相同進程的Android應用程序。 在第一個應用程序中,在啓動時,我將一個靜態int變量設置爲1(默認值爲0)。 在第二個應用程序中,我從另一個應用程序加載(使用反射)相同的類並讀取靜態int變量。我讀了0.可以在同一個進程中運行的兩個應用程序有不同的STATIC對象值嗎?

由於兩個應用程序運行在相同的過程,我希望他們共享相同的靜態值,不是? 誰能告訴我底下的機制是什麼? (他們使用,也許,不同的apk/dex裝載機,並導致這種行爲?)

+0

你確定他們實際上是在同一個進程中運行嗎? –

+0

你爲什麼要這麼做?嘗試使用反射來訪問另一個應用程序中的靜態變量聽起來似乎是個壞主意。 – Simon

+0

我想在我的兩個應用程序之間交換數據,這似乎比使用內容提供者或使用意圖更好(兩種方法都很好,但它們佔用兩個很多資源,特別是在涉及Bitmap時)。
我不明白爲什麼我的方法不起作用。 – EyalBellisha

回答

1

原來的答案是這樣的.... 它與類加載器是Java而不是進程或應用程序。

Java語言:一類是由它的全名 Java虛擬機標識:A類對象是通過其全名和定義類加載器確定由同一個類加載器加載的類一定會看到

實例相同的靜態變量。一個類加載器通常委託給它的父類加載器。如果父類已經加載了類,它將不會再加載它。這個標準行爲可以通過編寫你自己的類加載器來改變。結果是類加載器的層次結構只會加載一次類,因此分配靜態變量並運行一次靜態塊。 但是,如果您有多個類加載器的層次結構,則可以多次加載相同的類並多次分配靜態成員。即使是由同一個類文件生成的,由不同類加載器定義的兩個類對象也是不同的類型。由同一個類加載器加載的類的實例可以看到相同的靜態變量。 Forman和Forman的Java Reflection in Action的第6章很好的參考。

感謝您克里斯Matawa給我的答案對這個職位: https://groups.google.com/forum/?fromgroups=#!topic/android-developers/8-b5T1zYr-8

0

但他們採取了兩個多資源特別是當它涉及到位圖

使用一個靜態變量在不同的應用程序之間共享一個位圖(或者甚至是來自同一個應用程序的不同活動之間),在內存泄漏方面是一個壞主意;舉例來說,參見http://www.curious-creature.org/2008/12/18/avoid-memory-leaks-on-android/

不是節約資源,而是使用靜態變量在活動和應用程序之間共享數據和資源,這使事情變得更糟,因爲不僅所有這些東西都會永遠留在內存中(或者至少在很長一段時間內,他們不再需要他們),但更多的是,這些靜態的東西可以帶來很多其他的東西,因爲隱藏的和未知的引用。

這是爲什麼您應該使用Intents,SharedPreferences或數據庫來傳遞數據,併爲每個活動留出加載資源方面所需的內容。

一些需要時間加載的大資源有時可以在不同的活動之間共享,但是,如果您不想泄漏大量內存,則需要格外小心;這在任何移動設備上都是非常寶貴的。

相關問題