Подтвердить что ты не робот

Две службы с одним и тем же фильтром намерений

У меня на моем устройстве установлено два приложения, каждый из которых содержит компонент службы, и эти две службы имеют одно и то же объявление фильтра намерений, например:

<intent-filter>
<action android:name="com.example.intent.action.SHOW"/>
</intent-filter>

И я запускаю сервис таким образом:

Intent intent = new Intent();
intent.setAction("com.example.intent.action.SHOW");
startService(intent);

Я обнаружил, что одна из этих двух служб началась, но я не знаю, как это произошло. Как мы знаем, если мы напишем два действия с тем же объявлением фильтра намерений, откроется диалоговое окно и позволит пользователю выбрать чтобы завершить действие. Что меня смутило, так это то, как Android выбирает услугу, которая будет запущена в тех, у кого есть те же фильтры намерений, что и стратегия принятия этого решения?

Спасибо заранее!

обновление:
Юрий прав, вот фрагмент кода из фреймворков /base/services/java/com/android/server/pm/PackageMangerService.java на ICS:

public ResolveInfo resolveService(Intent intent, String resolvedType,
    int flags) {
List<ResolveInfo> query = queryIntentServices(intent, resolvedType,
        flags);
if (query != null) {
    if (query.size() >= 1) {
        // If there is more than one service with the same priority,
        // just arbitrarily pick the first one.
        return query.get(0);
    }
}
return null;
}

Как мы видим, если есть несколько сервисов, соответствующих запрошенному намерению, Android будет произвольно выбрать один для запуска. Но, какая служба будет фактически запущена, неожиданно.

4b9b3361

Ответ 1

Если есть более одного Сервиса с одним и тем же фильтром намерений, тогда ОС Android случайно выбирает одну из этих Услуг и передает ей намерение.

Ответ 2

Если имеется более 1 Service с соответствующим IntentFilter, будет выбран тот, который имеет наивысший приоритет. Если есть несколько служб, имеющих наивысший приоритет, - будет выбрана "случайная" служба.

Вот фрагмент кода, который гарантирует, что первый элемент имеет наивысший приоритет:

https://github.com/android/platform_frameworks_base/blob/master/services/java/com/android/server/IntentResolver.java#L320