无法在启动完成的接收器中通过onReceive()进行调试

Nit*_*tin 13 debugging android breakpoints broadcastreceiver bootcompleted

非常感谢这个网站,我在第一个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>
Run Code Online (Sandbox Code Playgroud)

接收器:

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
    }
Run Code Online (Sandbox Code Playgroud)

我的观察 -
1.当我在eclipse上以调试模式运行此应用程序时,断点甚至没有被击中.
2.当我在调试模式下运行其他应用程序时,会暂时触发此断点!但在我继续执行一步一步之前,执行将继续执行.它并不止于此.

我对此行为的推理是 -
1.当我运行其他应用程序时,由于上面的应用程序已经安装,它会捕获启动完成广播,因此断点被点击.(但是为什么执行不会在断点处停止?)
2.当我只运行这个应用程序时,它首先安装,并且在安装所需的时间内,它错过了启动完成广播.

我可以请求下面的查询 -
1.如果不进一步恢复,我如何在断点处停止执行?
2.我可以以某种方式在调试模式下在仿真器上运行已安装的此应用程序版本"无需在每次运行时在模拟器上进行新安装"吗?
还有什么我做错了或错过了什么吗?

请告诉我,因为我真的需要通过onReceive()来调试以捕获更多的应用程序逻辑错误.非常感谢,伙计们.

Lux*_*ode 10

您需要关闭手机并启动它,以便看到onReceive从中调用bootcompleted.要调试它,只需添加一个Log语句onReceive而不是设置断点.否则,你就必须添加一些actionreceivermanifest手动,然后sendBroadcast(new Intent("someName"))与你在指定的名称receiver中的元素manifest.

  • 谢谢,使用另一个广播事件模拟"启动完成"有助于调试大多数基本问题. (2认同)

joh*_*182 9

不知道为什么这个问题被问了很多次,而且很难找到答案,但这对我来说就像一个冠军.

  1. 在onReceive()覆盖中的接收器类中,添加以下对waitForDebugger()的调用作为第一次调用.
  2. 通过运行应用程序部署到设备.
  3. 一旦更新的apk在设备上,重启设备.
  4. 当设备重新启动时返回到IDE(在此示例中为Android Studio 1.4)并转到"运行"菜单>"将调试器附加到Android进程".
  5. 选中"显示所有进程".
  6. 等待...一旦命中了waitForDebugger()行,您的app/package将出现在此列表中.在我的情况下,设备重启后至少需要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";

}
Run Code Online (Sandbox Code Playgroud)