Невозможно выполнить отладку через onReceive() в загруженном получателе

Спасибо за тонну этого сайта, я добился значительного прогресса в своем первом проекте Android.

Я пытаюсь приостановить выполнение в методе onReceive() получателя, заполненного загрузкой. Ниже приведен мой манифест и код получателя.

Android 2.3.3
API - 10
IDE - Eclipse
Работа на эмуляторе

манифеста:

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

Получатель:

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
    }

Мои наблюдения -
1. Когда я запускаю это приложение в режиме отладки в eclipse, точка останова даже не попадает.
2. Когда я запускаю какое-либо другое приложение в режиме отладки, эта точка прерывания нажимается мгновенно! Но прежде чем я смогу выполнить пошаговое выполнение, выполнение возобновляется. Это не останавливается на достигнутом.

Мое рассуждение о таком поведении состоит в том, что -
1. Когда я запускаю какое-то другое приложение, так как это вышеприведенное приложение уже установлено, оно улавливает полную трансляцию загрузки и, таким образом, ударяется точка останова. (Но почему не останавливается выполнение в точке останова?)
2. Когда я запускаю только это приложение, оно устанавливается первым и в то время, которое требуется для установки, оно пропускает полную передачу загрузки.

Могу ли я получить некоторую помощь в следующих запросах -
1. Как я могу приостановить выполнение в точке останова, если он не возобновится?
2. Могу ли я каким-либо образом запустить уже установленную версию этого приложения на эмуляторе в режиме отладки "без его световой установки" на эмуляторе каждый раз, когда я запустил его?
3. Есть ли что-то еще, что я делаю неправильно или что-то не хватает?

Пожалуйста, дайте мне знать, так как мне действительно нужно отлаживать onReceive(), чтобы поймать дальнейшие ошибки логики приложения. Большое спасибо, ребята.

Ответ 1

Вам нужно выключить телефон и запустить его, чтобы когда-либо видеть, что onReceive вызывается из bootcompleted. Чтобы отладить это, просто добавьте оператор Log в onReceive вместо установки точки останова. В противном случае вам нужно добавить несколько action в receiver в manifest, а затем вручную sendBroadcast(new Intent("someName")) с именем, указанным в элементе receiver в manifest.

Ответ 2

Не знаю, почему этот вопрос задают так много раз, и было так сложно найти ответ, но для меня это работает как чемпион.

  • В классе приемника внутри переопределения onReceive() добавьте следующий вызов waitForDebugger() в качестве первого вызова.
  • Разверните устройство, запустив приложение.
  • После обновления apk на устройстве перезагрузите устройство.
  • Во время перезагрузки устройства вернитесь в свою IDE (в этом примере Android Studio 1.4) и перейдите в меню "Выполнить" > "Прикрепить отладчик к процессу Android".
  • Отметьте "Показать все процессы".
  • Подождите... Когда строка waitForDebugger() будет удалена, ваше приложение/пакет появится в этом списке. В моем случае это заняло не менее 2 минут ПОСЛЕ перезагрузки устройства.
  • Нажмите "ОК", подождите минуту, и ваша точка останова будет удалена.

Теперь вы можете выполнить свой код как обычно. Получайте удовольствие!

@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";

}

Ответ 3

Используйте приведенную ниже строку перед кодом, в котором вы хотите остановить отладчик:

android.os.Debug.waitForDebugger();

Ответ 4

Другой метод, который я предпочитаю, так как это означает, что вам не нужно перезапускать устройство (бурение, gradle занимает достаточно много времени, чтобы загрузить его), просто запустить приложение в режиме отладки, а затем смоделировать действие который вызовет ваш широковещательный приемник, используя следующую команду в вашем терминале.

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

Вышеописанное создает трансляцию с действием "BOOT_COMPLETE", и теперь вы можете отлаживать ее без перезапуска.