Cómo verificar IntentService start
Estoy tratando de probar el comportamiento de mi aplicación con Espresso-2.2
En la actividad principal, cuando se pulsa el botón, tanto el servicio como otra actividad se está iniciando:
- Cómo recopilar información de IntentService y actualizar la interfaz de usuario de Android
- File Observer no funciona desde el servicio de intenciones
- Utilizar Parcelable con un objeto con Hashmap
- ¿Está bien bloquear el subproceso de la interfaz de usuario al mostrar un diálogo de alerta?
- Cómo obtener el progreso de un IntentService
public class MainActivity extends Activity { public void onButtonClicked() { startActivity(SecondActivity.getStartIntent()); startService(MyIntentService.getStartIntent()); } }
Estoy probando si se están iniciando los componentes deseados:
public class MainActivityTest { @Rule public final IntentsTestRule<MainActivity> intentsRule = new IntentsTestRule<>(MainActivity.class, true); @Test public void shouldStartServiceOnButtonClicked() { onView(withId(R.id.button)).perform(click()); intended(hasComponent(hasClassName(SecondActivity.class.getName()))); intended(hasComponent(hasClassName(MyIntentService.class.getName()))); } }
Pero estoy recibiendo error:
Caused by: junit.framework.AssertionFailedError: Wanted to match 1 intents. Actually matched 0 intents. IntentMatcher: has component: has component with: class name: is "com.example.MyIntentService" package name: an instance of java.lang.String short class name: an instance of java.lang.String Matched intents:[] Recorded intents: -Intent { cmp=com.example/.SecondActivity (has extras) } handling packages:[[com.example]], extras:[Bundle[...]]) at junit.framework.Assert.fail(Assert.java:50)
Se registra el inicio de SecondActivity. ¿Por qué el inicio de mi IntentService no está registrado (he comprobado que se ha iniciado)?
- ¿Qué sucede cuando mi actividad se destruye cuando estoy usando IntentService con ResultReceiver
- CountDownTimer no funciona en IntentService
- Cómo comprobar si se inició IntentService
- Cómo determinar si la aplicación se ejecuta desde el servicio
- Cómo crear tostadas de IntentService? Se queda atascado en la pantalla
- ¿El enfoque de diseño de la aplicación de cliente restante en google io 2010 sigue actualizado?
- Android cómo comprobar si el servicio de intenciones sigue funcionando o si ha dejado de funcionar
- La notificación creada por IntentService utiliza siempre una intención incorrecta
Tl; dr no parece como si esto es posible dado el actual espresso-intenciones proporcionada funcionalidad
Cavé en el código fuente, ya que estoy tratando de hacer algo similar y esto es lo que encontré:
El matcher 'pretendido' funciona mirando una lista de intents grabados. Éstos son rastreados por una devolución de llamada que se registra con la instancia de IntentMonitor cuando Intents.init () se llama. La instancia de IntentMonitor está definida por el Instrumentation actual. Cada vez que se llama a la señalIntent () del IntentMonitor, se disparará la devolución de llamada en Intents.
El problema radica en el hecho de que signalIntent () nunca se llama en el caso en que se llama a activity.startService () con una intención. Esto se debe a que signalIntent () en el caso de AndroidJunitRunner sólo recibe el llamado por métodos que están expuestos en ExposedInstrumentationApi (que suceden a correlacionar sólo a los diversos métodos startActivity ()). Para usar espresso-intents con startService () parecería que un gancho de instrumentación para startService () necesitaría estar disponible que permitiría llamar a signalIntent () en el IntentMonitor.
No tengo experiencia con la adición de instrumentación personalizada a mis test apks, pero esta va a ser mi próxima avenida de investigación. Actualizaré mi respuesta si descubro algo que funcione.
Podría hacer una conjetura educada que el problema es que usted está atando para afirmar que el IntentService
se crea y se ejecuta inmediatamente después de que usted llama startService()
, mientras que el startService()
no es llamada sincrónica. Sucede en el hilo de UI, pero no imidiately. Usted puede posponer la validación por unos pocos molinos y comprobar entonces si el servicio comenzó.
- Cómo enviar el mensaje del servicio a la actividad
- Establecer la altura de ListView de forma dinámica en función de la vista de texto multilínea dentro de ella