10

Grazie mille a questo sito, ho compiuto notevoli progressi con il mio primo progetto Android.Impossibile eseguire il debug di onReceive() nel ricevitore di avvio completato

Sto cercando di sospendere l'esecuzione nel metodo onReceive() di un ricevitore di avvio completato. Di seguito sono riportati il ​​mio codice manifest e ricevitore.

Android 2.3.3
API - 10
IDE - Eclipse
Running on emulatore

manifesto:

<?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> 

Ricevitore:

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 
    } 

Le mie osservazioni -
1 Quando corro t la sua applicazione in modalità di debug su Eclipse, il punto di interruzione non è nemmeno colpito.
2. Quando eseguo un'altra applicazione in modalità di debug, questo punto di interruzione viene colpito momentaneamente! Ma prima che possa procedere con un'esecuzione passo passo, l'esecuzione riprende. Non si ferma qui.

Il mio ragionamento per questo comportamento è quello -
1. Quando eseguo qualche altra applicazione, poiché questa app è già installata, intercetta la trasmissione di avvio completa e quindi viene colpito il punto di interruzione. (Ma perché l'esecuzione non si ferma al punto di interruzione?)
2. Quando eseguo solo questa app, viene installata prima e nel tempo necessario per l'installazione, manca la trasmissione di avvio completa.

Posso ottenere assistenza con le seguenti domande:
1. Come posso interrompere l'esecuzione al punto di interruzione senza che riprenda ulteriormente?
2. Posso eseguire in qualche modo una versione già installata di questa app sull'emulatore in modalità di debug "senza averla per essere appena installata" sull'emulatore ogni volta che la eseguo?
3. C'è qualcos'altro che sto facendo male o manco qualcosa?

Gentilmente fammi sapere poiché ho davvero bisogno di eseguire il debug di onReceive() per catturare ulteriori bug di logica dell'applicazione. Grazie mille, gente.

risposta

10

È necessario arrestare il telefono e avviarlo fino a vedere sempre Ricevuto ricevere dal bootcompleted. Per eseguire il debug di questo, basta aggiungere una dichiarazione Log in onReceive invece di impostare un punto di interruzione. In caso contrario, sarà necessario aggiungere action allo receiver nello manifest e quindi manualmente sendBroadcast(new Intent("someName")) con il nome specificato nell'elemento receiver nello manifest.

+0

Grazie mille. sendBroadcast() mi ha aiutato a eseguire il debug attraverso il ricevitore :) Nome classe destinatario: TrackerReceiver.java. Line in metodo chiamare: sendBroadcast (new Intent (getApplicationContext(), TrackerReceiver.class); – Nitin

+2

Grazie, simulando il "boot completato" utilizzando un altro evento di trasmissione aiuta il debug la maggior parte dei problemi di base –

+0

@BenjaminPiette haha ​​buon punto potrebbe ottenere.. molto stancante per continuare a riavviare solo per eseguire il debug sul tuo Ricevimento – LuxuryMode

2

Utilizzare la linea di seguito prima del codice in cui si desidera il debugger per interrompere:

android.os.Debug.waitForDebugger(); 
6

Non capisco perché questa domanda è chiesto tante volte ed è stato così difficile trovare la risposta, ma questo funziona come un campione per me.

  1. Nella classe del ricevitore all'interno del comando onReceive(), aggiungere la chiamata di seguito per waitForDebugger() come prima chiamata.
  2. Distribuire sul dispositivo eseguendo l'app.
  3. Una volta che l'apk aggiornato si trova sul dispositivo, riavviare il dispositivo.
  4. Mentre il dispositivo si riavvia, torna al tuo IDE (in questo esempio Android Studio 1.4) e vai al menu "Esegui"> "Collega debugger al processo Android".
  5. Controllare "Mostra tutti i processi".
  6. Attendi ... Una volta raggiunta la riga waitForDebugger(), la tua app/pacchetto apparirà in questo elenco. Nel mio caso ci sono voluti almeno 2 minuti DOPO il riavvio del dispositivo.
  7. Fare clic su "OK", attendere un momento e il punto di interruzione verrà colpito.

Ora è possibile scorrere il codice normalmente. Divertiti!

@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

Eccellente scrittura dei passaggi per il debug, ma sfortunatamente per me non vedo mai la mia app elencata nelle opzioni disponibili per l'esecuzione. – GrandAdmiral

+0

Ha funzionato per me. –

2

Un altro metodo che io preferisco in quanto significa che non è necessario per mantenere il riavvio del dispositivo (noioso, Gradle prende abbastanza a lungo per caricare come è), è quello di eseguire semplicemente l'applicazione in modalità di debug e quindi simulare un'azione che chiamerà il ricevitore Broadcast utilizzando il seguente comando nel terminale.

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

È possibile che questo crea una trasmissione con l'azione "BOOT_COMPLETE" e ora è possibile eseguire il debug senza riavviare.

Problemi correlati