首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何使用intent传递接口

如何使用intent传递接口
EN

Stack Overflow用户
提问于 2020-06-11 15:40:27
回答 2查看 171关注 0票数 0

这是我的接口类

代码语言:javascript
运行
复制
interface InstallerInterface {
     fun onInstallation(context: Context)
}

我在这个类中实现了接口。

代码语言:javascript
运行
复制
class FirstActivity : InstallerInterface{
    override fun onInstallation(context: Context) {
         *MyCode*
    }
}

我已经尝试使用意图来传递这个上下文

代码语言:javascript
运行
复制
 val intent=Intent(context,SecondActivity::class.java)
        intent.putExtra("NAME",name)
        intent.putExtra("Callback",Interface)
        context.startActivity(intent)    

但是intent.putExtra导致了错误Cannot resolve method 'putExtra()。所以我在FirstActivity()类中实现了Serializable。但这导致了错误

代码语言:javascript
运行
复制
06-11 12:28:57.323  4042  4042 E AndroidRuntime: java.lang.RuntimeException: Parcelable encountered IOException writing serializable object (name = FirstAcitvity)
06-11 12:28:57.323  4042  4042 E AndroidRuntime:        at android.os.Parcel.writeSerializable(Parcel.java:1535)
06-11 12:28:57.323  4042  4042 E AndroidRuntime:        at android.os.Parcel.writeValue(Parcel.java:1483)
06-11 12:28:57.323  4042  4042 E AndroidRuntime:        at android.os.Parcel.writeArrayMapInternal(Parcel.java:732)
06-11 12:28:57.323  4042  4042 E AndroidRuntime:        at android.os.BaseBundle.writeToParcelInner(BaseBundle.java:1417)
06-11 12:28:57.323  4042  4042 E AndroidRuntime:        at android.os.Bundle.writeToParcel(Bundle.java:1157)
06-11 12:28:57.323  4042  4042 E AndroidRuntime:        at android.os.Parcel.writeBundle(Parcel.java:772)
06-11 12:28:57.323  4042  4042 E AndroidRuntime:        at android.content.Intent.writeToParcel(Intent.java:8703)
06-11 12:28:57.323  4042  4042 E AndroidRuntime:        at android.app.ActivityManagerProxy.startActivity(ActivityManagerNative.java:3082)
06-11 12:28:57.323  4042  4042 E AndroidRuntime:        at android.app.Instrumentation.execStartActivity(Instrumentation.java:1520)
06-11 12:28:57.323  4042  4042 E AndroidRuntime:        at android.app.Activity.startActivityForResult(Activity.java:4229)
06-11 12:28:57.323  4042  4042 E AndroidRuntime:        at androidx.fragment.app.FragmentActivity.startActivityForResult(FragmentActivity.java:676)
06-11 12:28:57.323  4042  4042 E AndroidRuntime:        at android.app.Activity.startActivityForResult(Activity.java:4187)
06-11 12:28:57.323  4042  4042 E AndroidRuntime:        at androidx.fragment.app.FragmentActivity.startActivityForResult(FragmentActivity.java:663)
06-11 12:28:57.323  4042  4042 E AndroidRuntime:        at android.app.Activity.startActivity(Activity.java:4526)
06-11 12:28:57.323  4042  4042 E AndroidRuntime:        at android.app.Activity.startActivity(Activity.java:4494)
06-11 12:28:57.323  4042  4042 E AndroidRuntime:        at foundation.e.apps.XAPK.LaunchUtils.startInstallSplitApksActivity(LaunchUtils.kt:15)
06-11 12:28:57.323  4042  4042 E AndroidRuntime:        at foundation.e.apps.XAPK.ViewUtils$installXApk$1.onCompedApks(ViewUtils.kt:57)
06-11 12:28:57.323  4042  4042 E AndroidRuntime:        at foundation.e.apps.XAPK.XApkInstallUtils$installSplitApks$2.run(XApkInstallUtils.kt:191)
06-11 12:28:57.323  4042  4042 E AndroidRuntime:        at android.os.Handler.handleCallback(Handler.java:751)
06-11 12:28:57.323  4042  4042 E AndroidRuntime:        at android.os.Handler.dispatchMessage(Handler.java:95)
06-11 12:28:57.323  4042  4042 E AndroidRuntime:        at android.os.Looper.loop(Looper.java:154)
06-11 12:28:57.323  4042  4042 E AndroidRuntime:        at android.app.ActivityThread.main(ActivityThread.java:6186)
06-11 12:28:57.323  4042  4042 E AndroidRuntime:        at java.lang.reflect.Method.invoke(Native Method)
06-11 12:28:57.323  4042  4042 E AndroidRuntime:        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:889)
06-11 12:28:57.323  4042  4042 E AndroidRuntime:        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:779)
06-11 12:28:57.323  4042  4042 E AndroidRuntime: Caused by: java.io.NotSerializableException: ThirdAcivity()
06-11 12:28:57.323  4042  4042 E AndroidRuntime:        at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1224)
06-11 12:28:57.323  4042  4042 E AndroidRuntime:        at java.io.ObjectOutputStream.defaultWriteFields(ObjectOutputStream.java:1584)
06-11 12:28:57.323  4042  4042 E AndroidRuntime:        at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1549)
06-11 12:28:57.323  4042  4042 E AndroidRuntime:        at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1472)
06-11 12:28:57.323  4042  4042 E AndroidRuntime:        at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1218)
06-11 12:28:57.323  4042  4042 E AndroidRuntime:        at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:346)
06-11 12:28:57.323  4042  4042 E AndroidRuntime:        at android.os.Parcel.writeSerializable(Parcel.java:1530)
06-11 12:28:57.323  4042

我相信ThirdActivity()实现了FirstActivity(),而我没有在ThirdAcivity中实现Serializable。所以我用ThirdAcitivity实现了Serializable。而且我在使用FirstAcivity的每个活动中都会遇到错误。这是一个很大的项目,我不能在每一个活动上都实现Serializable。所以我实现了Parcelable。我的代码是

代码语言:javascript
运行
复制
@Parcelize
class FirstActivity : InstallerInterface, Parcelable{
    override fun onInstallation(context: Context) {
         *MyCode*
    }
}

我收到了像java.lang.RuntimeException: Parcel: unable to marshal value这样的错误,我该如何修复这段代码。如果不是,还有什么更好的选择呢?提前谢谢你

EN

回答 2

Stack Overflow用户

发布于 2020-06-11 16:10:09

你的活动不应该实现Parcelable/Serializable。此外,传递活动引用可能会导致内存泄漏和应用程序崩溃(https://proandroiddev.com/everything-you-need-to-know-about-memory-leaks-in-android-d7a59faaf46ahttps://techbeacon.com/app-dev-testing/what-you-need-know-about-android-app-memory-leaks)

如果您想在另一个活动中执行某些操作并将结果返回给第一个活动,您可以使用startActivityForResult或新的Activity Result APIs。更多信息https://developer.android.com/training/basics/intents/result

票数 0
EN

Stack Overflow用户

发布于 2021-09-08 07:52:06

您不能“传递接口”。“接口”是一个抽象的东西。您想要传递的是该接口的具体实现,即:一个对象(恰好实现您的接口)。当您实例化您的“接口”时(在您的示例中,如下所示:

代码语言:javascript
运行
复制
intent.putExtra("testInterface", new ITest() {
    @Override 
    void onSuccess(String text) {
    }
}

然而,即使你这样做了,它也不会解决你的问题。您需要了解的是,您不能通过将对象(实例)作为“附加内容”放在Intent中来传递它们。当你这样做的时候,Android实际上会对对象进行序列化和反序列化,这样你就会得到两个对象,其中一个是原始对象的序列化/反序列化副本。

For more Details:->

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62319369

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档