2011-12-05 14 views
13

He instalado dos aplicaciones en el dispositivo, cada uno con un componente de servicio en ella y estos dos servicios tiene la misma declaración filtro de intención, como esto:servicio de dos con el mismo filtro intención

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

y comienzo el servicio de esta manera:

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

he encontrado que uno de estos dos servicios iniciados, pero no estoy seguro de cómo este happened.As sabemos, si escribimos dos actividades con la misma declaración filtro de intenciones, una el diálogo se activará y permitirá que el usuario elija una actividad para completar el acción. Lo que me confundió es que, como Android elige el servicio que se iniciará en estos que tienen los mismos filtros de intención, ¿cuál es la estrategia de tomar esta decisión?

¡Gracias de antemano!

actualización:
Yury está bien, aquí es el fragmento de código de marcos/base/servicios/java/com/android/servidor/PM/PackageMangerService.java en 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; 
} 

Como podemos ver Si hay más de un servicio que coincida con el intento solicitado, Android elegirá uno arbitrariamente para comenzar. Pero, qué servicio se iniciará realmente es inesperado.

+0

probar por su proyecto own.Create, forman dos servicios con intent.You misma automáticamente verá lo que sucede. Así que pruébalo amigo – Sameer

Respuesta

8

Si hay más de 1 Servicio con el mismo filtro de intención, Android OS selecciona aleatoriamente uno de estos Servicios y le pasa la intención.

+0

Gracias por tu respuesta, es muy valioso. – CalvinLee

3

Si hay más de 1 Servicio con IntentFilter coincidente, se elegirá el que tenga la prioridad más alta. Si hay varios Servicios que tienen la más alta prioridad, se elegirá un Servicio "aleatorio".

Aquí está la pieza de código que asegura que el primer elemento tiene la más alta prioridad:

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

+0

el enlace ya no funciona – Deepscorn

Cuestiones relacionadas