如何在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。
还有别的办法吗?
发布于 2017-08-17 07:51:21
解决方案: BundleCompat允许在所有安卓版本中使用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();
发布于 2016-11-03 08:55:46
这取决于你的目标。
如果要在一个进程中工作,只需使用Singleton
模式即可。但是,如果您想将真正的对象传递给(例如Service
),它具有属性android:isolatedProcess="true"
:
<service
android:name=".service.SomeService"
android:enabled="true"
android:exported="false"
android:isolatedProcess="true"/>
那么您就不能将原始对象传递给另一个进程。
一个进程中的应用程序不能保存另一个进程中的对象,更不用说对它们“调用操作”了。
来源:使用Android中的Messenger在IPC中传递对象
因此,正如我所看到的,您正在尝试使用Intent
机制传递原始对象。在我看来,它不可能通过Intent
来完成,因为包含在Intent
中的Bundle
没有存储对真实对象的引用,所以这是不可能的。
发布于 2016-11-03 10:06:37
在这种情况下,EventBus将是一个很好的选择,它类似于全局订阅-观察者,它可以帮助在任何对象之间传递原始对象。
在要传递对象的活动中这样做:
EventBus.getDefault().register(this);
EventBus.getDefault().post(new MessageEvent());
在要接收对象的活动中这样做:
首先,登记活动:
EventBus.getDefault().register(this);
其次,使用@订户定义一个接收对象的方法:
@Subscribe
public void onMessageEvent(MessageEvent event)
希望这能帮上忙。
https://stackoverflow.com/questions/40396848
复制相似问题