13

非常感谢这个网站,我的第一个 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() 进行调试以捕获更多的应用程序逻辑错误。非常感谢,伙计们。

4

4 回答 4

10

您需要关闭手机并启动它才能看到 onReceive 被调用bootcompleted。要调试它,只需添加一条Log语句onReceive而不是设置断点。否则,您必须在 中添加一些,action然后手动使用您在.receivermanifestsendBroadcast(new Intent("someName"))receivermanifest

于 2011-11-16T03:09:17.350 回答
9

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

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

}
于 2015-10-24T01:52:40.637 回答
3

我更喜欢的另一种方法,因为这意味着您不需要继续重新启动设备(无聊,gradle 需要足够长的时间才能加载),只需在调试模式下运行应用程序,然后模拟一个将调用您的广播的操作接收器在终端中使用以下命令。

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

上面创建了一个带有动作“BOOT_COMPLETE”的广播,现在您可以在不重新启动的情况下进行调试。

于 2017-03-04T22:45:51.210 回答
2

在您希望调试器停止的代码之前使用以下行:

android.os.Debug.waitForDebugger();
于 2014-01-22T08:29:04.060 回答