2011-04-22 92 views
2

這是一個非常簡單的問題,但我一直無法找到我想要做的事情...Android:是否可以引用第二個活動中的活動?

我想啓動一個新的活動來顯示一些複雜的信息。由於其複雜性,不希望將信息序列化爲意圖的參數。新的Activity是否可以獲取對啓動活動的引用,以便它可以調用它的方法?

+1

你想傳遞數據還是調用其他活動的方法? – Priyank 2011-04-22 14:10:37

+0

@Priyank。調用方法。 – ab11 2011-04-22 14:13:48

+0

看看我的答案是否有幫助。 – Priyank 2011-04-22 14:21:32

回答

4

如果您使用自定義應用程序類,則可以存儲將保留在活動之間的信息。

例如,參見tutorial here

2

不能依賴活動的生命週期。在這種情況下,共享數據的一種方式是擁有一個單獨的存儲要在這兩個活動之間共享的數據。

2

您可以將公共靜態字段添加到包含this(第一個活動)的第一個活動。

但是要注意,第一個活動可能會在Android使用第二個活動時被銷燬,所以如果第一個活動被銷燬,您將不得不實施一個回退方法。

並且不要忘記在第一個活動的onDestroy()回調中取消設置公共靜態變量,否則會泄漏內存。

+0

爲什麼我需要在onDestroy()中取消設置?第一個活動是我的主要活動,所以它的onDestroy()意味着應用程序正在關閉。我假設在這種情況下,我不關心內存泄漏? – ab11 2011-04-22 14:16:27

+0

不,第一個活動被破壞,但不一定是整個應用程序。如果你不在'onDestroy()'中取消設置該變量,你將把整個活動保存在內存中(即使這個活動的這個特定實例不再存在),你會泄漏很多內存。這正是[這裏]描述的問題(http://developer.android.com/resources/articles/avoiding-memory-leaks.html),特別看到摘要的第一點。 – 2011-04-22 14:21:18

+0

從閱讀這篇文章看來,這個問題似乎是靜態引用了引用Activity的變量?並非所有的靜態都必須在onDestroy()中明確發佈。例如,如果我的程序中的某個地方定義了一個常量:public static final String SOME_CONSTANT =「someconstant」,我不擔心會造成內存泄漏。它是否正確? – ab11 2011-04-22 14:44:22

1

你可以讓你的複雜對象ActivityApublicstatic,並訪問他們在ActivityB這樣的:

MyCustomObjectType complexFromA = ActivityA.complexObject;

這會工作,但同時ActivityB,你不能總是確保來自ActivityA的靜態對象將存在(它們可能爲空),因爲Android可能會終止您的應用程序。

所以那麼也許添加一些空的檢查:

if(null == ActivityA.complexObject) { 
    //go back to ActivityA, or do something else since the object isn't there 
} 
else { 
    //business as usual, access the object 
    MyCustomObjectType complexFromA = ActivityA.complexObject; 
} 

你也可以使用延伸Application一個Singleton對象。 Android終止您的應用程序時,您會遇到同樣的問題。總是需要檢查對象是否真的存在。使用單例擴展Application方法似乎是更有組織的方式 - 但增加了實現的複雜性。只取決於你需要做什麼以及適用於你的實現。

+0

通過以下方式檢查對象是否足夠安全:Activity.complexObject!= null? – ab11 2011-04-22 14:18:11

+0

是的,但只有當你將complexObject初始化爲null時,你將它定義爲一個字段:'public static MyComplexObject complexObject = null;',否則你將不得不檢查'null == complexObject'。 – binnyb 2011-04-22 14:21:19

2

新建活動是否可以獲取對啓動活動的引用,以便它可以調用其方法?

請不要這樣做。 Android可以並將銷燬活動來釋放內存。

像你描述的複雜信息不應該由活動擁有。它應該保存在一箇中央數據模型中,就像你在任何其他應用程序中一樣。無論中央數據模型是由Service還是單例或自定義Application對象來決定,都取決於數據類型,緩存模型,內存泄漏風險等等。

+0

謝謝,這似乎是正確的解決方案。我選擇了marvinlabs的回答,因爲他首先回應。 – ab11 2011-04-22 14:45:37

-1

使用getParent()來自新的活動,並呼籲家長的方法

Android Activity call another Activity method

+0

我不確定這會起作用,醫生說:「如果這個視圖是一個嵌入的孩子,請返回父母的活動。」這似乎並非如此(但我可能是錯的)。來自文檔的 – 2011-04-22 14:24:00

+0

:'getParent():如果此視圖是嵌入的子項,則返回父活動。我不認爲這將是什麼適用於這個問題 – binnyb 2011-04-22 14:24:33

+0

這是行不通的。那不是你要找的那種父母。 – zeh 2011-12-15 20:33:16

0

你應該創建一個單獨的類,這兩個活動可以使用。

public class HelperClass{ 

public void sharedFunction(){ 
//implement function here 
} 

} 

我會建議遠離android中的靜態變量。它可能會導致一些意外的行爲。

相關問題