如何在Android上将原始对象(NOT COPY)从一个活动传递到另一个活动

时间:2016-11-03 08:30:46

标签: android android-activity parameter-passing

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

当然,我们可以序列化(Serializable,Parcelable,来自/来自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

还有其他方法吗?

4 个答案:

答案 0 :(得分:0)

这取决于你的目标 如果您要在一个流程中工作,只需使用 xcopy /Y /S "C:\Users\userName\workspace\Java-API" "C:\Users\userName\Downloads\dummyTest" echo Finished copying stuff cd .\trent\ echo We are in trent folder mvn clean install echo finished maven clean install pause 模式即可。 但是,如果您想将您的真实对象传递给,例如Singleton,其属性为Service

android:isolatedProcess="true"

然后你不能将你的原始对象传递给另一个进程。

  

你做不到。一个进程中的应用无法保存另一个进程中的对象   过程,更不用说“调用操作”了。

来源:Passing Objects in IPC using Messenger in Android

所以,我可以看到你正试图使用​​<service android:name=".service.SomeService" android:enabled="true" android:exported="false" android:isolatedProcess="true"/> 机制传递你的原始对象。在我看来,通过Intent来实现它是不可能的,因为Intent中包含的Bundle不存储对真实对象的引用。所以,这是不可能的。

答案 1 :(得分:0)

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

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

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

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

首先,注册活动:

EventBus.getDefault().register(this);

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

@Subscribe
public void onMessageEvent(MessageEvent event) 

希望这会有所帮助。

答案 2 :(得分:0)

<强>解: BundleCompat允许对所有Android版本使用putBinder / getBinder。

ActivityA:

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

ActivityB:

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

答案 3 :(得分:-2)

示例对象应该是Parcelable。

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