У меня есть два приложения, A и B, которые используют библиотеку C. Android. B имеет службу A, которая хочет использовать через C, например.Как сделать явным намерение явно?
<service android:name="my.package.in.a.service.ConnectorService"
android:exported="true">
<intent-filter>
<action android:name="my.package.in.a.action.START_A"/>
</intent-filter>
</service>
В моей библиотеке есть класс, который пытается связать его с сервисом, например.
Intent intent = new Intent("my.package.in.a.service.ConnectorService");
/** establish a connection with the service. */
boolean result = context.bindService(intent, messenger,
Context.BIND_AUTO_CREATE);
По-видимому, вы больше не можете этого делать из-за проблем с безопасностью (подразумеваемые против явных намерений). Я попытался инициализировать намерение, используя действие, определенное в A. Я также попытался добавить имя пакета, а также попытался установить имя класса, например.
Intent intent = new Intent()
intent.setPackage("my.package.in.a.service");
intent.setClassName("my.package.in.a.service",
"my.package.in.a.service.ConnectorService");
Я попытался найти службу, используя диспетчер пакетов, например.
Intent intent = new Intent("my.package.in.a.service.ConnectorService");
List<ResolveInfo> resolveInfoList = context.getPackageManager()
.queryIntentServices(intent, Context.BIND_AUTO_CREATE);
if (resolveInfoList.isEmpty()) {
Log.e(TAG, "could not find any service");
}
if (resolveInfoList.size() > 1) {
Log.e(TAG, "multiple services found");
}
Я немного озадачен тем, что я делаю неправильно? Насколько я понял, вы можете сделать неявное намерение явным, даже если оно не является частью одного и того же пакета/приложения, просто указав имя пакета/classname. Однако все это, кажется, терпит неудачу и, очевидно, я делаю что-то неправильно?
Я добавил инициализацию в последнем фрагменте кода моего вопроса. однако он все еще терпит неудачу. действительно ли мне нужно определить помощь, как вы? – user1729210
@ user1729210: «Мне действительно нужно определить помощь, как вы?» - если вы пытаетесь установить связь между приложениями, абсолютно. Также обратите внимание, что ваш отредактированный фрагмент кода по-прежнему не вызывает 'setComponent()'. – CommonsWare