如何使用intent传递一个接口

问题描述 投票:0回答:1

这是我的接口类

interface InstallerInterface {
     fun onInstallation(context: Context)
}

我实现了这个类中的接口

class FirstActivity : InstallerInterface{
    override fun onInstallation(context: Context) {
         *MyCode*
    }
}

我曾试图将这个上下文使用意图传递给

 val intent=Intent(context,SecondActivity::class.java)
        intent.putExtra("NAME",name)
        intent.putExtra("Callback",Interface)
        context.startActivity(intent)    

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

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() 而我没有实施 SerializableThirdAcivity. 所以我实施 SerializableThirdAcitivity . 而我在每个使用了 FirstAcivity. 这是个大项目,我无法实现。Serializable 所以我在每个Acitivity上实现了 Parcelable 而不是。我的代码是

@Parcelize
class FirstActivity : InstallerInterface, Parcelable{
    override fun onInstallation(context: Context) {
         *MyCode*
    }
}

而我得到的错误是 java.lang.RuntimeException: Parcel: unable to marshal value我怎样才能修复这段代码。如果没有,有什么更好的选择。先谢谢你

android kotlin android-intent parcelable serializable
1个回答
0
投票

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

如果你想在另一个活动中做一些事情,并将结果返回给第一个活动,你可以使用 startActivityForResult 或新 Activity Result APIs. 更多信息 https:/developer.android.comtrainingbasicsintentsresult

© www.soinside.com 2019 - 2024. All rights reserved.