Не удается выполнить отладку через 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(), чтобы выявить дальнейшие логические ошибки приложения. Большое спасибо, ребята.


person Nitin    schedule 16.11.2011    source источник


Ответы (4)


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

person LuxuryMode    schedule 16.11.2011
comment
Большое спасибо. sendBroadcast() помог мне отлаживать приемник :) Имя класса приемника: TrackerReceiver.java. Строка в вызывающем методе: sendBroadcast(new Intent(getApplicationContext(), TrackerReceiver.class); - person Nitin; 06.12.2011
comment
Спасибо, имитация завершения загрузки с помощью другого широковещательного события помогает устранить большинство основных проблем. - person Benjamin Piette; 13.09.2012
comment
@BenjaminPiette, ха-ха, хорошая мысль. Может быть очень утомительно постоянно перезагружаться только для отладки вашего onReceive - person LuxuryMode; 13.09.2012

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

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

}
person johnw182    schedule 24.10.2015
comment
Отличное описание шагов по отладке, но, к сожалению для меня, я никогда не вижу свое приложение в списке процессов, доступных для запуска. - person GrandAdmiral; 17.06.2016
comment
Работал на меня. Спасибо - person Code Pope; 23.03.2017

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

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

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

person LifeQuestioner    schedule 04.03.2017

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

android.os.Debug.waitForDebugger();
person user3136215    schedule 22.01.2014