Как намерение с Parcelable передается между двумя приложениями?

У меня есть служба в приложении для Android2. Я хочу запустить службу из приложения1 и передать объект альбома в Intent службе в приложении2.

В приложении1

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");

}

Я могу передать String в Intent. Если я поставлю Intent the Parcelable, я получу ошибку.

02-27 14:12:18.438 22198-22198/com.eusecom.demoad E/Parcel: Class not found when unmarshalling: com.eusecom.samshopersung.models.Album java.lang.ClassNotFoundException: com.eusecom.samshopersung.models.Album at java.lang.Class.classForName(Native Method) at java.lang.Class.forName(Class.java:400) at android.os.Parcel.readParcelableCreator(Parcel.java:2517) at android.os.Parcel.readParcelable(Parcel.java:2471) at android.os.Parcel.readValue(Parcel.java:2374) at android.os.Parcel.readArrayMapInternal(Parcel.java:2727) at android.os.BaseBundle.unparcel(BaseBundle.java:269) at 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) at android.app.ActivityThread.-wrap23(ActivityThread.java) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1740) at android.os.Handler.dispatchMessage(Handler.java:102) at android.os.Looper.loop(Looper.java:154) at android.app.ActivityThread.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) Caused by: java.lang.ClassNotFoundException: Didn't find class "com.eusecom.samshopersung.models.Album" on path: DexPathList[[zip file "/data/app/com.eusecom.demoad-1/base.apk"],nativeLibraryDirectories=[/data/app/com.eusecom.demoad-1/lib/arm64, /system/lib64, /vendor/lib64]] at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:56) at java.lang.ClassLoader.loadClass(ClassLoader.java:380) at 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)  at android.os.Parcel.readParcelable(Parcel.java:2471)  at android.os.Parcel.readValue(Parcel.java:2374)  at android.os.Parcel.readArrayMapInternal(Parcel.java:2727)  at android.os.BaseBundle.unparcel(BaseBundle.java:269)  at 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)  at android.app.ActivityThread.-wrap23(ActivityThread.java)  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1740)  at android.os.Handler.dispatchMessage(Handler.java:102)  at android.os.Looper.loop(Looper.java:154)  at android.app.ActivityThread.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)  02-27 14:12:18.439 22198-22198/com.eusecom.demoad D/AndroidRuntime: Shutting down VM 02-27 14:12:18.440 22198-22198/com.eusecom.demoad E/AndroidRuntime: FATAL EXCEPTION: main Process: com.eusecom.demoad, PID: 22198 java.lang.RuntimeException: Unable to start service com.eusecom.demoad.view.EkasaService@fe9af21 with Intent { cmp=com.eusecom.demoad/.view.EkasaService launchParam=MultiScreenLaunchParams { mDisplayId=0 mFlags=0 } (has extras) }: android.os.BadParcelableException: ClassNotFoundException when unmarshalling: com.eusecom.samshopersung.models.Album at android.app.ActivityThread.handleServiceArgs(ActivityThread.java:3702) at android.app.ActivityThread.-wrap23(ActivityThread.java) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1740) at android.os.Handler.dispatchMessage(Handler.java:102) at android.os.Looper.loop(Looper.java:154) at android.app.ActivityThread.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) Caused by: android.os.BadParcelableException: ClassNotFoundException when unmarshalling: com.eusecom.samshopersung.models.Album at android.os.Parcel.readParcelableCreator(Parcel.java:2545) at android.os.Parcel.readParcelable(Parcel.java:2471) at android.os.Parcel.readValue(Parcel.java:2374) at android.os.Parcel.readArrayMapInternal(Parcel.java:2727) at android.os.BaseBundle.unparcel(BaseBundle.java:269) at 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) at android.app.ActivityThread.-wrap23(ActivityThread.java)  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1740)  at android.os.Handler.dispatchMessage(Handler.java:102)  at android.os.Looper.loop(Looper.java:154)  at android.app.ActivityThread.main(ActivityThread.java:6692)  at java.lang.reflect.Method.invoke(Native Method) 

Альбом реализует Parcelable?

Antonis Radz 27.02.2019 14:33

@ Антонис Радз Конечно. Я реализовал посылки в обоих приложениях в классах Альбом

eurosecom 27.02.2019 14:37

Нет, на мой взгляд, вы не можете напрямую разделять и обмениваться объектами из одного приложения в другое. Вам потребуется создать Поставщик услуг в одном приложении и получить к нему доступ с помощью Преобразователь контента в другом. (Основная проблема во время десортировки во втором приложении заключается в том, что конкретное имя класса com.eusecom.samshopersung.models.Album не существует во втором приложении, очевидно... имя пакета отличается)

Jeel Vankhede 27.02.2019 14:49

Имеет ли класс Album точно такое же полное имя класса в обоих приложениях?

David Wasser 27.02.2019 15:40

@ David Wasser Название класса - это тот же альбом, но, конечно, упаковка отличается.

eurosecom 27.02.2019 15:49

Если имена пакетов различаются, это разные классы. Кстати, они должны оставаться прежними даже после обфускации, если вы когда-нибудь будете ее использовать.

18446744073709551615 27.02.2019 15:51

Из-за разных имен пакетов второе приложение не может удалить лишнее из Intent. Смотрите мой ответ для лучшего подхода.

David Wasser 27.02.2019 16:34
1
7
102
1

Ответы 1

Вам лучше сериализовать объект в строку, передать строку в Intent, а затем десериализовать строку в объект в целевом приложении.

Каков максимальный размер строки в Intent?

eurosecom 27.02.2019 15:50

Около 1 Мб, может чуть меньше. Если ваш объект очень большой, вам лучше хранить его в базе данных или в файле, а не помещать в Intent

David Wasser 27.02.2019 16:32

Другие вопросы по теме