10

Gracias mucho a este sitio, he hecho un progreso significativo con mi primer proyecto de Android.No se puede depurar a través de onReceive() en el receptor de inicio de compilación

Estoy tratando de obtener la suspensión de la ejecución en el método onReceive() de un receptor de arranque completo. A continuación están mi código manifiesto y receptor.

Android 2.3.3
API - 10
IDE - Eclipse
se ejecuta en el emulador

Manifiesto:

<?xml version="1.0" encoding="utf-8"?> 
    <manifest xmlns:android="http://schemas.android.com/apk/res/android" 
package="com.android.demo.notepad3" > 

<uses-sdk android:minSdkVersion="10" /> 

<uses-permission android:name="android.permission.VIBRATE" /> 
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" /> 

<application android:icon="@drawable/icon" > 
    <activity 
     android:label="@string/app_name" 
     android:name=".ProjectTrackerHomeActivity" > 
     <intent-filter > 
      <action android:name="android.intent.action.MAIN" /> 

      <category android:name="android.intent.category.LAUNCHER" /> 
     </intent-filter> 
    </activity> 
    <activity android:name=".ProjectTrackerEditActivity" /> 

    <receiver android:name=".ProjectTrackerNotification" /> 

    <receiver 
     android:name=".ProjectTrackerOnBootReceiver" > 
     <intent-filter > 
      <action android:name="android.intent.action.BOOT_COMPLETED" /> 
     </intent-filter> 
    </receiver> 
</application> 

</manifest> 

receptor:

public class ProjectTrackerOnBootReceiver extends BroadcastReceiver { 
private ProjectTrackerDBAdapter mDbHelper; 

@Override 
public void onReceive(Context context, Intent intent) { 
    Debug.waitForDebugger(); 
    AlarmManager 
       mgr=(AlarmManager)context.getSystemService(Context.ALARM_SERVICE); 

       //I place the break point at line 2, the alarm manager line 

      // Further code, irrelevant 
    } 

Mis observaciones - 1
Cuando corro t su aplicación en modo de depuración en eclipse, el punto de quiebre ni siquiera es alcanzado.
2. Cuando ejecuto alguna otra aplicación en modo de depuración, este punto de interrupción se golpea momentáneamente! Pero antes de que pueda proceder con una ejecución paso a paso, la ejecución se reanuda. No se detiene allí.

Mi razonamiento para este comportamiento es que -
1. Cuando ejecuto alguna otra aplicación, ya que esta aplicación anterior ya está instalada, capta la transmisión completa de arranque y se golpea el punto de interrupción. (¿Pero por qué la ejecución no se detiene en el punto de interrupción?)
2. Cuando solo ejecuto esta aplicación, primero se instala y en el tiempo que lleva instalarla, se pierde la transmisión completa de arranque.

Puedo obtener ayuda con las siguientes consultas:
1. ¿Cómo puedo detener la ejecución en el punto de interrupción sin que se reanude?
2. ¿De alguna manera puedo ejecutar una versión ya instalada de esta aplicación en el emulador en modo de depuración "sin tener que instalarlo recientemente" en el emulador cada vez que lo ejecuto?
3. ¿Hay algo más que esté haciendo mal o me falta algo?

Tenga la amabilidad de informarme ya que realmente necesito depurar mediante onReceive() para detectar más errores de lógica de la aplicación. Muchas gracias, amigos.

Respuesta

10

Debe apagar el teléfono y encenderlo para poder verlo en Reciba llamar desde bootcompleted. Para depurar esto, simplemente agregue una declaración Log en onReceive en lugar de establecer un punto de interrupción. De lo contrario, deberá agregar algunos action al receiver en el manifest y luego manualmente sendBroadcast(new Intent("someName")) con el nombre que especificó en el elemento receiver en el manifest.

+0

Muchas gracias. sendBroadcast() me ayudó a depurar a través del receptor :) Nombre de la clase del receptor: TrackerReceiver.java. Método de invocación de línea: sendBroadcast (nueva intención (getApplicationContext(), TrackerReceiver.class); – Nitin

+2

Gracias, simular el "arranque completo" utilizando otro evento de difusión ayuda a depurar la mayoría de los problemas básicos. –

+0

@BenjaminPiette jaja, buen punto. muy agotador para mantener el reinicio solo para depurar su onReceive – LuxuryMode

2

Utilice la línea de abajo antes de que el código en el que desea que el depurador se detenga:

android.os.Debug.waitForDebugger(); 
6
No

seguro de por qué esta pregunta se hace tantas veces y que era tan difícil de encontrar la respuesta, pero esto funciona como una campeón para mí.

  1. En su clase de receptor dentro de la anulación onReceive() agregue la siguiente llamada para waitForDebugger() como la primera llamada.
  2. Implementar en el dispositivo ejecutando la aplicación.
  3. Una vez que la apk actualizada está en el dispositivo, reinicie el dispositivo.
  4. Mientras el dispositivo se reinicia, regrese a su IDE (en este ejemplo Android Studio 1.4) y vaya al menú "Ejecutar"> "Adjuntar depurador al proceso de Android".
  5. Marca "Mostrar todos los procesos".
  6. Espera ... Una vez que se golpea la línea waitForDebugger(), su aplicación/paquete aparecerá en esta lista. En mi caso, tomó al menos 2 minutos DESPUÉS de que el dispositivo se reiniciara.
  7. Haga clic en "Aceptar", espere un momento y su punto de interrupción se verá afectado.

Ahora puede recorrer su código como lo hace normalmente. ¡Que te diviertas!

@Override 
public void onReceive(Context context, Intent intent) { 

    // Add this at beginning of method 
    android.os.Debug.waitForDebugger(); 

    // Place breakpoint below 
    String myVariable = "Some Value"; 

} 
+0

Excelente redacción de los pasos para depurar, pero desafortunadamente para mí nunca veo mi aplicación listada en la prosessess disponible para ejecutar. – GrandAdmiral

+0

funcionó para mí. Gracias –

2

Otro método que yo prefiero, ya que significa que no es necesario para mantener reiniciar el dispositivo (aburrido, Gradle toma el tiempo suficiente para cargar como lo es), es simplemente ejecutar la aplicación en modo de depuración y luego simular una acción que llamará a su receptor de difusión usando el siguiente comando en su terminal.

adb shell am broadcast -a android.intent.action.BOOT_COMPLETED -p com.example.package_name 

Lo anterior crea una emisión con la acción "BOOT_COMPLETE" y ahora puede depurar sin necesidad de reiniciar.

Cuestiones relacionadas