2011-12-05 16 views
13

Mam dwie aplikacje zainstalowane w urządzeniu, każdy z komponentu usługi w nim i te dwie usługi ma taką samą deklarację filtra intencji, tak:dwie usługi z tym samym filtrem zamiarem

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

I zacznę usługa w ten sposób:

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

Okazało się, że jeden z tych dwóch usług rozpoczęty, ale nie jestem pewien, jak to happened.As wiemy, czy piszemy dwie czynności z tym samym oświadczeniem filtra intencji, pojawi się okno dialogowe i pozwoli użytkownikowi wybrać działanie, aby ukończyć Akcja, która mnie wprawiła w zakłopotanie, to to, jak Android wybiera usługę do uruchomienia w tych, którzy mają te same filtry zamiarów, jaka jest strategia podejmowania tej decyzji?

Z góry dziękuję!

zmiana:
Yury ma rację, tutaj jest fragment kodu z ram/base/usługi/java/com/android/server/PM/PackageMangerService.java na 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; 
} 

Jak widzimy , jeśli więcej niż jedna usługa jest zgodna z zamierzonym intencją, Android wybierze dowolną opcję, aby rozpocząć. Ale, która usługa zostanie uruchomiona, jest niespodziewana.

+0

Spróbuj przez own.Create projektu, tworząc dwie usługi samym intent.You automatycznie zobaczyć co się dzieje. Więc spróbuj tego kolego – Sameer

Odpowiedz

8

Jeśli istnieje więcej niż 1 Usługa z tym samym filtrem intencyjnym, system operacyjny Android losowo wybiera jedną z tych Usług i przekazuje do niej zamiar.

+0

Dzięki za odpowiedź, jest to bardzo cenne. – CalvinLee

3

Jeśli zostanie wybrana więcej niż jedna usługa z pasującym filtrem IntentFilter, zostanie wybrany ten o najwyższym priorytecie. Jeśli istnieje wiele Usług, które mają najwyższy priorytet, zostanie wybrana usługa "losowa".

Oto fragment kodu, który zapewnia, że ​​pierwsza pozycja ma najwyższy priorytet:

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

+0

Link już nie działa – Deepscorn

Powiązane problemy