0

我有一个简单的疑问。在 android 中,几乎到处都说要传递一个Stringint任何你应该使用Intent和使用的putextra()东西,或者传递它的任何东西activity,因为我可以创建一个静态对象并从任何地方访问它activity

使用意图这样做必须有一些原因,谁能告诉我为什么我们需要intent将一个对象从一个对象传递activity到另一个对象,我们可以像在java中一样正常地做到这一点。

4

5 回答 5

7

因为我们不会在静态上下文中考虑活动。活动有生命周期,因此我们尝试将我们的数据整合到这个生命周期中,而不是绕过它。

仅使用静态变量并没有直接的问题,但可能会出现一些问题。例如,假设您显示一个Activity. String您需要的孩子可能Activity与您以前需要的不同,因此当向后导航到 that 的前一个实例时Activity,该值不是您所期望的。

传递String通过Intent也使Activity独立。Activity不应该以与另一个紧密耦合的方式设计一个。传递数据Intent意味着只要传递正确的数据,任何人Activity都可以启动它。Activity

也就是说,在某些情况下使用可静态访问的变量是合理的,例如对于不会更改且可被应用程序的多个部分访问的常量值,或者对于多个活动可能需要的任何数据。

于 2012-06-13T04:50:37.227 回答
3

通常,您可以使用静态将数据从一个传递Activity到另一个。这并不意味着这是最好的主意。Intent 以下是使用extras的几个原因。

  1. 这是一个约定。 这是大多数 Android 开发人员所做的,这很重要。如果您以外的任何人要阅读或维护您的代码,最好使用通用解决方案来解决您的编程问题。

  2. 通常,在 Java 或其他 OO 编程语言中,最好避免使用静态变量(除非它们是常量)。 这是一篇关于为什么会这样的文章,这是一篇文章。

  3. 考虑一个普通的非 Android 应用程序。忘记ActivitiesIntents。如果你有一个控制器对象需要创建另一个控制器对象,它可以使用如下代码:

FirstController.java:

public void doSomething() {
    SecondController newController = new SecondController();
    newController.start();
}

如果你想将一个字符串变量从第一个控制器传递给第二个控制器,你不会使用静态变量......你只需这样做:

    newController.start("WithSomeData");

现在,再想想安卓。 Activity对象的实例化方式不同。一个Activity不只是简单地new启动另一个,持有对它的引用,然后调用它的方法。这就是为什么需要这个相当复杂的过程。因为如果Activity对象是通过Intent对象间接创建的,那么“调用者”还没有对“被调用”对象的引用,因此不能使用正常的方法和参数传递。因此,如果我们接受此限制,那么您需要另一种方式来传递信息。由于该Intent对象用于创建一个Activity或返回一个现有的,因此赋予处理额外数据(如传递的参数)的能力Activity是有意义的。Intents

同样,创建此解决方案是因为普遍不喜欢使用静态变量以及它们的问题。

但是,如果您只有两个Activity类,并且每个类只有一个并发实例Activity,那么您可能会摆脱静态变量。由于我概述的原因,我仍然不会推荐它。

于 2012-06-13T05:11:40.173 回答
2

从Intent中读取 Intent 定义

意图是对要执行的操作的抽象描述。在 Android 中,Intent 用于激活组件(Activity、Service、BroadcastReceivers)。您可以通过静态变量传递字符串或其他数据,但这不是一个好习惯,因为在大型应用程序中,如果您使用静态变量,您会很头疼。

读取意图也有两种类型,隐式意图和显式意图,在显式意图中,您可以使用静态变量,因为您知道目标组件,但是通过未指定目标组件的隐式意图,静态变量没有任何用处。

于 2012-06-13T04:48:11.847 回答
0

我相信在意图上使用 .putExtras() 的主要原因是在两个活动之间传递一个大对象,例如字符串数组。

尽管如此,我还是建议创建一个包含所有要在多个活动中使用的变量的全局类,访问多个变量都在一个地方比尝试在之间传递一堆变量要简单得多活动。

于 2012-06-13T04:49:05.517 回答
0

简单来说,静态变量应该在加载时预加载......所以,它会增加内存使用和你的处理,如果你的应用程序没有执行到使用静态变量......预加载变量是没有价值的.

于 2012-06-13T04:56:39.923 回答