Android:是否可以引用第二个活动中的活动?

问题描述:

这是一个非常简单的问题,但我一直无法找到我想要做的事情...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

如果您使用自定义应用程序类,则可以存储将保留在活动之间的信息。

例如,参见tutorial here

不能依赖活动的生命周期。在这种情况下,共享数据的一种方式是拥有一个单独的存储要在这两个活动之间共享的数据。

您可以将公共静态字段添加到包含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

你可以让你的复杂对象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

新建活动是否可以获取对启动活动的引用,以便它可以调用其方法?

请不要这样做。 Android可以并将销毁活动来释放内存。

像你描述的复杂信息不应该由活动拥有。它应该保存在一个*数据模型中,就像你在任何其他应用程序中一样。无论*数据模型是由Service还是单例或自定义Application对象来决定,都取决于数据类型,缓存模型,内存泄漏风险等等。

+0

谢谢,这似乎是正确的解决方案。我选择了marvinlabs的回答,因为他首先回应。 – ab11 2011-04-22 14:45:37

使用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

你应该创建一个单独的类,这两个活动可以使用。

public class HelperClass{ 

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

} 

我会建议远离android中的静态变量。它可能会导致一些意外的行为。