【问题标题】:How to pass an origin object(NOT COPY) from one activity to another on Android如何在 Android 上将源对象(非复制)从一个活动传递到另一个活动
【发布时间】:2017-03-16 18:18:53
【问题描述】:

如何在 Android 上将源对象从一个活动传递到另一个活动?

当然,我们可以序列化(Serializable、Parcelable、to/from JSON)并传递对象数据的副本,然后可以创建具有相同数据的新对象;但它不会有相同的引用。

这里有一些解决方案:

第一个活动的代码:

final Object objSent = new Object();
final Bundle bundle = new Bundle();
bundle.putBinder(OBJECT_KEY, new ObjectWrapperForBinder(objSent));
startActivity(new Intent(this, SecondActivity.class).putExtras(bundle));        

第二个活动的代码:

final Object objReceived = ((ObjectWrapperForBinder)getIntent().getExtras().getBinder(OBJECT_KEY)).getData();

但要求最低 API 级别 18

还有其他方法吗?

【问题讨论】:

  • 你想通过将原始对象“传递”给另一个活动来实现什么?全局类可以持有该对象并从另一个活动中检索吗?

标签: android android-activity parameter-passing


【解决方案1】:

解决方案: BundleCompat 允许对所有 Android 版本使用 putBinder/getBinder。

活动A:

final Bundle bundle = new Bundle();
BundleCompat.putBinder(bundle,KEY, new ObjectWrapperForBinder(callback));
intent.putExtras(bundle);

活动B:

object = ((ObjectWrapperForBinder)BundleCompat.getBinder(intent.getExtras(),KEY)).getData();

【讨论】:

    【解决方案2】:

    在这种情况下,EventBus 将是一个不错的选择。它类似于全局订阅观察者,它可以帮助在任何对象之间传递原始对象。

    在要传递对象的活动中执行此操作:

    EventBus.getDefault().register(this);
    EventBus.getDefault().post(new MessageEvent());
    

    在要接收对象的活动中执行此操作:

    首先,注册活动:

    EventBus.getDefault().register(this);
    

    其次,用@Subscriber定义一个方法来接收对象:

    @Subscribe
    public void onMessageEvent(MessageEvent event) 
    

    希望这会有所帮助。

    【讨论】:

      【解决方案3】:

      这取决于你的目标。
      如果你打算在一个进程中工作,你可以简单地使用Singleton 模式。 但是如果你想将你的真实对象传递给,例如Service,它具有android:isolatedProcess="true" 属性:

      <service
          android:name=".service.SomeService"
          android:enabled="true"
          android:exported="false"
          android:isolatedProcess="true"/>
      

      那么你不能将你的源对象传递给另一个进程。

      你不能。一个进程中的应用程序不能保存来自另一个进程的对象 进程,更不用说对它们“调用操作”了。

      来源:Passing Objects in IPC using Messenger in Android

      所以,正如我所见,您正在尝试使用Intent 机制传递您的原始对象。在我看来,通过Intent 是不可能的,因为Bundle 包含在Intent 中,它不存储对真实对象的引用。所以,这是不可能的。

      【讨论】:

        【解决方案4】:

        示例对象应该是 Parcelable。

        SampleObject objSent=new SampleObject();
        Intent intent=new Intent(mContext,NewActivity.class);
        intent.putExtra(objSent);
        startActivity(intent);
        

        【讨论】:

          猜你喜欢
          • 2011-02-23
          • 2011-02-13
          • 1970-01-01
          • 2018-10-10
          • 2013-01-12
          • 1970-01-01
          • 2011-01-28
          • 1970-01-01
          相关资源
          最近更新 更多