Невозможно выполнить отладку с помощью onReceive () в получателе с завершенной загрузкой. - PullRequest
13 голосов
/ 16 ноября 2011

Огромное спасибо этому сайту, я добился значительного прогресса в своем первом проекте для 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.Могу ли я каким-либо образом запускать уже установленную версию этого приложения на эмуляторе в режиме отладки, "не устанавливая его заново" на эмуляторе каждый раз, когда я запускаю его?Что-то пропустили?

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

Ответы [ 4 ]

10 голосов
/ 16 ноября 2011

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

9 голосов
/ 24 октября 2015

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

  1. В классе получателя в переопределении onReceive () добавьте приведенный ниже вызов для waitForDebugger () в качестве первого вызова.
  2. Развернуть на устройстве, запустив приложение.
  3. Как только обновленный apk будет на устройстве, перезагрузите устройство.
  4. Во время перезагрузки устройства вернитесь в IDE (в этом примере Android Studio 1.4) и перейдите в меню «Выполнить»> «Подключить отладчик к процессу Android».
  5. Установите флажок «Показать все процессы».
  6. Подождите ... Как только строка waitForDebugger () будет нажата, ваше приложение / пакет появится в этом списке. В моем случае это заняло не менее 2 минут ПОСЛЕ перезагрузки устройства.
  7. Нажмите «ОК», подождите немного, и ваша точка останова будет достигнута.

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

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

}
2 голосов
/ 05 марта 2017

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

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

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

2 голосов
/ 22 января 2014

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

android.os.Debug.waitForDebugger();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...