【问题标题】:How to pass information between Activities如何在活动之间传递信息
【发布时间】:2012-09-10 23:26:06
【问题描述】:

我已经在这里问过这个问题几次了,但仍然没有足够的信心开始在我的代码中投入一些东西,因为我担心我会破坏它已经拥有的功能。

我想要做的是与我可以发送/接收数据的设备建立蓝牙连接,并能够从几个不同的活动中访问它。我知道可以使用 Intents,但是任何人都可以尝试解释 Intents 是如何工作的吗?

我不明白如果我从一个 Activity 开始,我如何在该 Activity 中构建一个对象,然后结束它,并且仍然拥有该对象。当我在以下 Activity 中调用意图时,如何访问它?

我找不到带有自定义对象的 Activity 的示例代码,该对象通过 Intent 传递,在另一个 Activity 中打开,然后再次通过另一个 Activity,依此类推。我能找到的只是字符串、整数的东西,而且这些方法似乎是为特定对象硬编码的。

任何帮助将不胜感激,谢谢。

【问题讨论】:

  • 我不认为它是重复的,因为我更多地指定了我的问题。我不只是传递数据,我试图一遍又一遍地传递一个自定义类。另一个线程谈论将字符串从活动 #1 传递到活动 #2,仅此而已。

标签: android android-intent


【解决方案1】:

如果你想将一个自定义对象从一个 Activity 传递给另一个,你的对象必须实现 Parcelable 接口。

Here 你可以找到一个实现 Parcelable 的对象的例子。 一旦你有了这个对象的一个​​实例,你就可以将它添加到一个意图中并将它传递给其他活动。

假设您有 2 个活动:A 和 B。 如果您想将自定义对象从 A 发送到 B,请尝试将 Parceable 对象放入 Intent 中,然后在 Activity B 中将其取回。

// Activity A
Notebook myNotebook = new Notebook(); // the "Parcelable" object
Intent intent = new Intent(A.this, B.class);
intent.putExtra("object", myNotebook);
startActivityForResult(intent);

// Activity B
// in onCreate method
Notebook notebook = intent.getParcelableExtra("object");

【讨论】:

    【解决方案2】:

    您没有找到传输复杂对象的好例子是有充分理由的:您不会这么想。可以有意地转移任何对象,将要转移的类声明为实现 Serializable 或 Parcalable。

    但是 - 不建议这样做,除非你有充分的理由。 创建“跨活动”对象(数据库、单音、服务..)的方法不受限制,并且在意图中传递复杂的对象是繁重的操作。这样做也会造成糟糕的表现。

    无论如何 - 如果你想这样做,就是这样:

    这是传递可序列化对象的方法:

    Intent intent =  new Intent();
        intent.putExtra(name, someInstanceOfClassWhichImplementsSerializableInterface);
    

    这是在其他活动中实现它的方法:

    getIntent().getSerializableExtra(name);
    

    关于您不了解完成活动后对象如何仍然存在的问题 - finish() 活动不会触发干扰器!!!,但会触发 onDestoy() 回调 .系统决定何时调用活动 distracor ,即使它是干扰者 - 它不会阻止 Intent 对象保持活动 - 因为没有人说你的活动是唯一持有对它的引用的活动。系统持有的意图引用,目的是将其传递给使用它打开的新活动。

    【讨论】:

    • 谢谢,您认为单例单例方法是解决我的问题的更好方法吗?这似乎是意图的最佳替代方案,而我对意图并不满意,似乎它们不是最佳选择。
    • 保存共享数据的单音类可能是一个不错的选择。但是,如果您的课程不是太复杂/太大-将其作为 Serializble 传递并不是那么糟糕。请记住,不建议以这种方式传递复杂的大对象
    • 如果我使用单例方法,我是否仍然使用意图来启动新的活动?我认为单例方法最适合我,因为它需要我学习最少的新信息。
    • user1435712:单音设计模式与意图之间没有联系,所以我不明白你为什么这么问。无论如何-没有意图就无法开始活动。这是唯一的方法
    • @user1435712:这些是链接,例如如何使用应用程序类。 intridea.com/blog/2011/5/24/…我不明白你为什么需要做这样的事情。您可以在 android 开发人员中看到他们推荐使用单音,而不是扩展类应用程序 - developer.android.com/reference/android/app/Application.html
    【解决方案3】:

    使用意图,您可以发送序列化对象,就像将您的对象转换为字节流一样。如果您想按原样发送对象,则可以使用处理程序。 例如

    1. 使用服务(安卓服务)创建蓝牙连接
    2. 在您的活动中定义处理程序,这将是静态对象
    3. 从服务发送对象添加到 msg.obj 将该 msg 发送到处理程序

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-01-07
      • 2013-06-11
      • 2013-02-01
      • 1970-01-01
      相关资源
      最近更新 更多