具有Parcelable的Intent如何在两个App之间传递?

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

我在android app2中得到了服务。我想从app1启动服务,并在App2中将Intent中的Album对象传递给Service。

在app1中

var alb: Album = Album()
alb.name="album name"
alb.numOfSongs=1
alb.thumbnail=2

var serviceIntent: Intent = Intent();
var componentName: ComponentName = ComponentName("com.eusecom.demoad","com.eusecom.demoad.view.EkasaService")
serviceIntent.setComponent(componentName)
serviceIntent.putExtra("albumpar", alb)
context.startService(serviceIntent)

在服务类的app2中

@Override
public int onStartCommand(Intent intent, int flags, int startId) {

    Album alb = intent.getParcelableExtra("albumpar");

}

我可以在Intent中传递String。如果我把Intece放入Parcelable我会得到错误。

02-27 14:12:18.438 22198-22198 / com.eusecom.demoad E / Parcel:解组时找不到类:com.eusecom.samshopersung.models.Album java.lang.ClassNotFoundException:com.eusecom.samshopersung.models。位于android.os.Parcel的android.os.Parcel.readParcelableCreator(Parcel.java:2517)的java.lang.Class.cfor.Name(Class.java:400)的java.lang.Class.classForName(Native Method)专辑。在Android.os.BarBundle.unparcel(BaseBundle.java)的android.os.Parcel.readValue(Parcel.java:2374)的android.os.Parcel.readAalray(Parcel.java:2727)中的readParcelable(Parcel.java:2471) :269)在android.os.BaseBundle.getString(BaseBundle.java:992)的android.content.Intent.getStringExtra(Intent.java:6743)com.eusecom.demoad.view.EkasaService.onStartCommand(EkasaService.java: 29)在android.app.ActivityThread.handleServiceArgs(ActivityThread.java:3685)android.app.ActivityThread.-wrap23(ActivityThread.java)android.app.ActivityThread $ H.handleMessage(ActivityThread.java:1740)at android .os.Handler.disp atchMessage(Handler.java:102)位于android.app.Looper.loop(Looper.java:154)的android.app.ActivityThread.main(ActivityThread.java:6692)at java.lang.reflect.Method.invoke(Native方法)com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:1468)at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1358)引起:java.lang.ClassNotFoundException :没有在路径上找到类“com.eusecom.samshopersung.models.Album”:DexPathList [[zip file“/data/app/com.eusecom.demoad-1/base.apk"],nativeLibraryDirectories=[/data /app/com.eusecom.demoad-1/lib/arm64,/ system / lib64,/ vendor / lib64]],位于java.lang.ClassLoader.loadClass的dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:56) ClassLoader.java:380)java.lang.ClassLoader.loadClass(ClassLoader.java:312)at java.lang.Class.classForName(Native Method)at java.lang.Class.forName(Class.java:400)at android .os.Parcel.readParcelableCreator(Parcel.java:2517)在android.os.Parcel.readParcelable(Parcel.ja) va:2471)在android.os.Parcel.readValue(Parcel.java:2374)的android.os.Parcel.readArrayMapInternal(Parcel.java:2727)android.os.BaseBundle.unparcel(BaseBundle.java:269) android.os.BaseBundle.getString(BaseBundle.java:992)at android.content.Intent.getStringExtra(Intent.java:6743)at com.eusecom.demoad.view.EkasaService.onStartCommand(EkasaService.java:29)at android .app.ActivityThread.handleServiceArgs(ActivityThread.java:3685)位于android.app.Handler上android.app.ActivityThread $ H.handleMessage(ActivityThread.java:1740)的android.app.ActivityThread.-wrap23(ActivityThread.java) .dispatchMessage(Handler.java:102)位于android.app.Looper.loop(Looper.java:154)的android.app.ActivityThread.main(ActivityThread.java:6692),位于java.lang.reflect.Method.invoke(本地方法)com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:1468)at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1358)02-27 14:12: 18.439 22198-22198 / com.euse com.demoad D / AndroidRuntime:关闭VM 02-27 14:12:18.440 22198-22198 / com.eusecom.demoad E / AndroidRuntime:FATAL EXCEPTION:main进程:com.eusecom.demoad,PID:22198 java.lang。 RuntimeException:无法使用Intent启动服务com.eusecom.demoad.view.EkasaService@fe9af21 {cmp = com.eusecom.demoad / .view.EkasaService launchParam = MultiScreenLaunchParams {mDisplayId = 0 mFlags = 0}(has extras)}:android .os.BadParcelableException:解组时的ClassNotFoundException:android.app.A活动中的android.app.ActivityThread.- wrap23(ActivityThread.java)的android.app.ActivityThread.handleServiceArgs(ActivityThread.java:3702)中的com.eusecom.samshopersung.models.Album。 app.ActivityThread $ H.handleMessage(ActivityThread.java:1740)位于android.app.ActivityThread的android.os.Handler.dispatchMessage(Handler.java:102)android.os.Looper.loop(Looper.java:154) .main(ActivityThread.java:6692)at java.lang.reflect.Method.invoke(Native Method)at com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run (ZygoteInit.java:1468)at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1358)引起:android.os.BadParcelableException:解组时的ClassNotFoundException:com.eusecom.samshopersung.models.Album at android位于android.os.Parcel的android.os.Parcel.readValue(Parcel.java:2374)的android.os.Parcel.readParcelable(Parcel.java:2471)中的.os.Parcel.readParcelableCreator(Parcel.java:2545)。 readArrayMapInternal(Parcel.java:2727)位于android.oc.BaseBundle.unparcel(BaseBundle.java:269),位于android.content.Intent.getStringExtra(Intent.java)的android.os.BaseBundle.getString(BaseBundle.java:992) :6743)在android.app.ActivityThread.-wrap23(ActivityThread.java)的android.app.ActivityThread.handleServiceArgs(ActivityThread.java:3685)的com.eusecom.demoad.view.EkasaService.onStartCommand(EkasaService.java:29) )在android.app.Loper.loop(Looper.java:154)上的android.app.ActivityThread $ H.handleMessage(ActivityThread.java:1740)android.os.Handler.dispatchMessage(Handler.java:102) t android.app.ActivityThread.main(ActivityThread.java:6692)at java.lang.reflect.Method.invoke(Native Method)

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

最好将对象序列化为String,在Intent中传递String,然后将String反序列化为目标应用程序中的对象。

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