【问题标题】:How To Test BOOT_COMPLETED Broadcast Receiver In Emulator如何在模拟器中测试 BOOT_COMPLETED 广播接收器
【发布时间】:2012-07-04 18:30:00
【问题描述】:

我想通过emulator 中的操作BOOT_COMPLETED 检查BROADCAST RECEIVER

有什么方法可以检查模拟器中的广播接收器吗?如何重新启动模拟器以检查该接收器?有没有直接的命令?

提前致谢。

【问题讨论】:

  • 我尝试使用 adb 发送广播,但它在 Android O 上对我不起作用。我遇到了安全异常。我不得不重新启动模拟器,实际上我是通过按住电源按钮图标并从 GUI 中选择重新启动来完成的。

标签: android android-emulator broadcastreceiver


【解决方案1】:

在我在 Qemu 上的 Lollipop x86 模拟器上,它需要我以 root 身份运行:

adb shell su root am broadcast -a android.intent.action.BOOT_COMPLETED

没有root,命令失败:报警管理器不发送广播:

adb shell am broadcast -a android.intent.action.BOOT_COMPLETED

Broadcasting: Intent { act=android.intent.action.BOOT_COMPLETED }
java.lang.SecurityException: Permission Denial: not allowed to send broadcast android.intent.action.BOOT_COMPLETED from pid=26595, uid=2000
    at android.os.Parcel.readException(Parcel.java:1684)
    at android.os.Parcel.readException(Parcel.java:1637)
    at android.app.ActivityManagerProxy.broadcastIntent(ActivityManagerNative.java:3537)
    at com.android.commands.am.Am.sendBroadcast(Am.java:772)
    at com.android.commands.am.Am.onRun(Am.java:404)
    at com.android.internal.os.BaseCommand.run(BaseCommand.java:51)
    at com.android.commands.am.Am.main(Am.java:121)
    at com.android.internal.os.RuntimeInit.nativeFinishInit(Native Method)
    at com.android.internal.os.RuntimeInit.main(RuntimeInit.java:262)

【讨论】:

    【解决方案2】:

    如果您使用风味,请注意. 组件名称快捷方式表示法。

    例子

    adb shell am broadcast -a android.intent.action.BOOT_COMPLETED -n com.companyname.develop/com.companyname.notification.RescheduleLocalNotificationsAtBootReceiver
    

    【讨论】:

      【解决方案3】:

      如果两次收到 BOOT_COMPLETED,某些应用可能会出现异常行为,而是将广播仅限于您的包:

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

      【讨论】:

      • 为了一个奇怪的乐趣,我复制了命令而不添加我的包名,希望我能看到一些应用程序“真的”行为不端。它几乎杀死了所有其他应用程序并在某种程度上重新启动了设备。值得... :)
      • 我和developer.android.com/tools/help/shell.html#IntentSpec 的-p 选项错误没有提到?
      • 不是所有Android版本都支持-p,可以试试-n package_name/class_name
      【解决方案4】:

      基本上这是您在运行时在 Android 模拟器中模拟启动完成所必须做的:假设您是 Windows 用户。这同样适用于 Linux

      步骤:在您的控制台类型上

      1. adb 外壳

      2. am 广播 -a android.intent.action.BOOT_COMPLETED

      这就是所有人。 详细说明请参见下图

      编码愉快!

      【讨论】:

      • 如果你想要一个班轮,那就是adb shell su -c am broadcast -a android.intent.action.BOOT_COMPLETED
      • 因为答案没有包含Windows OS 的行,所以使用这个-adb shell am broadcast -a android.intent.action.BOOT_COMPLETED
      • Getting java.lang.SecurityException: Permission Denial: not allowed to send broadcast android.intent.action.BOOT_COMPLETED from pid=203 99, uid=2000
      • 对于那些有 SecurityException 的人,在 adb shell 之前尝试 adb root
      【解决方案5】:

      模拟器中没有像设备那样的电源按钮,所以

      要停止模拟器实例,只需关闭模拟器窗口即可。

      对于Start/Restart从 Eclipse 的 AVD 管理器开始,您的带有 BOOT_COMPLETE 操作的 BroadcastReceiver 将被调用肯定

      您也可以通过其他方式启动 AVD,从 CMD 转到 AndroidSDK 的工具 并给出此命令 E:\android-sdk-windows\tools>emulator -avd AVDNAMEHERE

      从 CMD 发送广播,您可以使用此命令。

      adb shell 广播 -a android.intent.action.BOOT_COMPLETED -c android.intent.category.HOME -n package_name/class_name


      阅读有关 Android 模拟器的更多信息:Android EmulatorUsing Emulator

      【讨论】:

      • adb shell am broadcast -a android.intent.action.BOOT_COMPLETED 足以重启设备。
      • 不幸的是,发送该广播会导致我的 Nexus 5真正重新启动,而不仅仅是广播该消息。结果,调试器断开连接。 /sigh 发送这样的广播应该让开发人员以更易于使用的方式访问:-( :-(
      • 广播:Intent { act=android.intent.action.BOOT_COMPLETED flg=0x400000 pkg=com.myapp.package } 安全异常:权限拒绝:不允许发送广播 android.intent.action.BOOT_COMPLETED从 pid=11148, uid=2000
      • 如何在我的路径中获取 adb?我安装了 android studio 4,除了运行该命令的 eclipse 日志外,在任何地方都找不到它。
      【解决方案6】:

      要重新启动模拟器,只需打开命令行并切换到 adb 所在的文件夹(如果不在系统路径中)并输入:

      adb restart
      

      (然后您可以使用 Strg - C 中止命令以返回 cmd 行)

      【讨论】:

      • adb reboot 有效,adb restart:adb:用法:未知命令重启
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-05-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多