Android Can';t在引导完成的接收器中通过onReceive()进行调试

Android Can';t在引导完成的接收器中通过onReceive()进行调试,android,debugging,broadcastreceiver,breakpoints,bootcompleted,Android,Debugging,Broadcastreceiver,Breakpoints,Bootcompleted,多亏了这个网站,我的第一个Android项目取得了重大进展 我试图在引导完成的接收器的onReceive()方法中获得执行挂起。下面是我的清单和接收者代码 安卓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.a

多亏了这个网站,我的第一个Android项目取得了重大进展

我试图在引导完成的接收器的onReceive()方法中获得执行挂起。下面是我的清单和接收者代码

安卓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>
我的观察-
1。当我在eclipse上以调试模式运行此应用程序时,甚至没有达到断点。
2。当我在调试模式下运行另一个应用程序时,这个断点会立即出现!但在我可以继续一步一步执行之前,执行会继续。这还不止于此

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

我可以就以下问题获得一些帮助吗?
1。如何使执行在断点处停止,而不继续执行?
2。我是否可以在调试模式下在emulator上运行已安装版本的此应用程序,而不必每次运行时都在emulator上重新安装它?
3.我还有什么做错或遗漏的吗


请告诉我,因为我确实需要通过onReceive()进行调试,以捕获更多的应用程序逻辑错误。非常感谢,各位。

您需要关闭手机并启动它,才能看到onReceive从
启动时被呼叫完成。要调试它,只需在
onReceive
中添加
Log
语句,而不是设置断点。否则,您必须将一些
操作
添加到
清单
中的
接收器
,然后手动
发送广播(新意图(“someName”))
使用您在
清单

接收器
元素中指定的名称,在希望调试器停止的代码前使用以下行:

android.os.Debug.waitForDebugger();

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

  • 在onReceive()覆盖内的receiver类中,添加以下对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";
    
    }
    

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

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

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

    非常感谢。sendBroadcast()帮助我调试接收器:)接收器类名:TrackerReceiver.java。调用方法中的行:sendBroadcast(新意图(getApplicationContext(),TrackerReceiver.class);谢谢,模拟“引导完成”使用另一个广播事件有助于调试大多数基本问题。@BenjaminPiette哈哈,这是一个很好的观点。如果只是为了调试您的OnReceive而不断重新启动,可能会非常累。关于调试步骤的精彩文章,但不幸的是,我从未在可运行的进程中看到我的应用程序。为我工作。谢谢
    adb shell am broadcast -a android.intent.action.BOOT_COMPLETED -p com.example.package_name