У меня есть приложение, которое использует службу, которая включена в пакет приложения.
Сейчас я делаю новое приложение, которое использует более новую версию того же сервиса, связанного с его собственным пакетом приложения.
Если на устройстве установлено только одно приложение, это работает нормально.Однако, если на устройстве установлены оба приложения, они оба используют службу из того пакета, который был установлен не так давно, т. Е. Самого старого.Это проблематично по двум причинам: 1) старая служба не обрабатывает новые вызовы (очевидно) 2) при использовании службы, связанной с другим приложением, служба в конечном итоге использует сохраненные данные этого другого приложения вместо своих собственных.
В краткосрочной перспективе я просто хочу, чтобы каждое приложение взаимодействовало со своей версией сервиса.Можно ли сделать это, не заставляя каждую связанную услугу реагировать на уникальное намерение, и чтобы каждое приложение использовало это уникальное намерение?
В долгосрочной перспективе было бы неплохо, если бы оба приложения по желанию могли общаться с новейшей версиейслужбы, и пусть они обмениваются данными, и хорошо играют с любым удаленным приложением.Какой правильный способ сделать это?Данные в основном находятся в базе данных SQLite, которая хранится там, где указано Context.getDatabasePath()
, что, конечно, зависит от приложения и стирается, если это приложение удаляется.
Вот что я пробовал до сих пор:
Я могу использовать PackageManager.queryIntentServices()
, чтобы получить список ResolveInfo с обеими версиями сервиса.Глядя на ResolveInfo.serviceInfo.applicationInfo.packageName
, я могу сказать, что есть что.Однако, по-видимому, нет никакого способа использовать это ResolveInfo, чтобы указать, какой из двух сервисов я хочу обработать намерение.
Похоже, что это должно быть правильно:
serviceIntent.setPackage(context.getApplicationContext().getApplicationInfo().packageName);
, поскольку этот packageName совпадает с тем, который я хочу найти.Действительно, когда я звоню queryIntentServices
с этим измененным намерением, я получаю список обратно, содержащий только службу в моем пакете.Тем не менее, когда я пытаюсь связать службу с этим намерением, она выдает исключение безопасности.
java.lang.RuntimeException: Unable to bind to service my.service.package.name.MyServiceClass@40531558 with Intent { act=my.intent.string pkg=my.app.package.name }: java.lang.SecurityException: Not allowed to start service Intent { act=RuntimeException: Unable to bind to service my.service.package.name.MyServiceClass } without permission private to package
Основываясь на поиске, я также попытался создать намерение, выполнив:
Intent serviceIntent = new Intent().setClassName(
"my.service.package.name",
"my.service.package.name.ServiceClassName");
Это не разрешается никаким сервисам вообще.
Я также пытался изменить android:exported=
в записи сервиса в AndroidManifest.xml на true, false или не указано, в различных комбинациях в обоих приложениях,но безрезультатно.(Я надеялся, что если установить для них обоих значение false, то каждое приложение сможет видеть только свою копию службы.)