我想将接口(interface)从第一个 Activity 传递到第二个 Activity 。
我想从第二个 Activity 的界面启动方法,这将影响第一个 Activity 。
我很清楚不使用 onActivityResult 是非常过分的机制,它可能不是好的编程,但请和我一起滚动。
这是问题所在 - 我的接口(interface)无法实现 Serializable/Parcelable因为接口(interface)不能实现另一个类。
这是我的界面:
public interface ITest {
void onSuccess(String text);
}
但是,我无法使用此界面开始我的 Activity ,因为它不是 Parcelable .
intent.putExtra("testInterface", new ITest() {
@Override
void onSuccess(String text) {
}
}
显然,我收到一个编译错误:
无法解析方法“putExtra(java.lang.String, ITest)”
最佳答案
你不能“传递接口(interface)”。 “接口(interface)”是一个抽象的东西。您想要传递的是该接口(interface)的具体实现,即:一个对象(恰好实现了您的接口(interface))。当你实例化你的“接口(interface)”时(在你的例子中,像这样:
intent.putExtra("testInterface", new ITest() {
@Override
void onSuccess(String text) {
}
}
您实际上是在创建实现接口(interface) ITest
的匿名类的实例。要在 Intent
中传递它,您需要使此类也实现 Parcelable
或 Serializable
。
但是,即使您这样做了,也不能解决您的问题。您需要了解的是,您不能通过将对象(实例)作为“extras”放在 Intent
中来传递它们。当您这样做时,Android 实际上会序列化然后反序列化该对象,这样您最终会得到 2 个对象,一个是原始对象的序列化/反序列化副本。
如果您希望ActivityB
与ActivityA
通信,您将需要使用另一种技术。尝试其中之一:
ActivityB
发送广播Intent
,ActivityA
监听ActivityA
使用startActivityForResult()
启动ActivityB
并且ActivityB
将数据发送回ActivityA
使用setResult()
- 使用
public static
(即:全局)变量进行通信 - 将数据存储在共享首选项、文件或数据库中
您真正需要了解的是,在某些情况下,可能会发生以下情况:
- 您的应用正在运行,
ActivityA
在堆栈中,ActivityB
在堆栈顶部 - 用户按下主页
- Android 将您的任务移至后台并最终终止托管进程
- 用户返回到您的应用(通过重新启动它或从“最近的任务”列表中选择它)
- Android 为您的应用程序创建一个新进程,并实例化
ActivityB
,然后调用onCreate()
、onStart()
和ActivityB
的 onResume()
在这种情况下,不再有 ActivityA
的实例。那个实例已经死了。所以 ActivityB
无法与 ActivityA
通信,因为它不再存在。
关于android - 在 Intent 中传递 Activity 之间的接口(interface) - 接口(interface)无法序列化或可打包,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38893042/