【问题标题】:Sending intent to BroadcastReceiver from adb从 adb 向 BroadcastReceiver 发送意图
【发布时间】:2014-05-03 06:54:42
【问题描述】:

我有 BroadcastReceiver 类:

public class IntentReceiver extends BroadcastReceiver {

    final String tag = "Intent Intercepter";

    @Override
    public void onReceive(Context context, Intent intent) {
        try {
            String data = intent.getStringExtra("sms_body");
            Log.i(tag, data);
            Toast.makeText(context, data.subSequence(0, data.length()), Toast.LENGTH_LONG).show();
        } catch (Exception e) {
            Toast.makeText(context, "Intercepted", Toast.LENGTH_LONG).show();
        }
    }
}

而且在清单中:

<receiver android:name="com.whereismywifeserver.IntentReceiver" android:enabled="true">
    <intent-filter android:priority="999">
        <action android:name="com.whereismywifeserver.intent.TEST"/>
    </intent-filter>
</receiver>

但是当我尝试从 adb 发送意图时,我收到错误:

$ adb shell am start 
-a com.whereismywifeserver.intent.TEST
--es sms_body "test from adb" 
-c android.intent.category.HOME 
-n com.whereismywifeserver/.IntentReceiver
Starting: Intent { act=com.whereismywifeserver.intent.TEST t=[android.intent.category.HOME] cmp=com.whereismywifeserver/.IntentReceiver (has extras) }
Error type 3
Error: Activity class {com.whereismywifeserver/com.whereismywifeserver.IntentReceiver} does not exist.

当我在代码中创建意图时,一切正常。那么如何从 adb 发送意图呢?

【问题讨论】:

标签: android android-intent broadcastreceiver adb


【解决方案1】:

您无需指定接收方。你可以用 adb 代替。

adb shell am broadcast -a com.whereismywifeserver.intent.TEST 
--es sms_body "test from adb"

有关整数附加值等更多参数,请参阅documentation

【讨论】:

  • 由于某种原因,如果额外字符串(上例中的test from adb)包含空格,则广播无法到达接收者。否则它会起作用。
  • 我和@user2137020有同样的问题
  • 事实证明,如果你想要额外的字符串,你确实需要-n com.whereismywifeserver/.IntentReceiver
  • 有没有办法用标志发送这样的广播?
  • @iammrmehul - 文档说要使用带有标志的 -f,但我不确定它看起来如何...developer.android.com/studio/command-line/adb#IntentSpec
【解决方案2】:

我发现命令错误,正确的命令包含“广播”而不是“开始”:

adb shell am broadcast -a com.whereismywifeserver.intent.TEST --es sms_body "test from adb" -n com.whereismywifeserver/.IntentReceiver

【讨论】:

    【解决方案3】:

    从 ADB 命令发送广播的真正方法是:

    adb shell am broadcast -a com.whereismywifeserver.intent.TEST --es sms_body "test from adb"
    

    而且,-a 表示 ACTION--es 表示额外发送 String


    附言。您还可以通过指定不同的参数来发送其他数据类型,例如:

    [-e|--es <EXTRA_KEY> <EXTRA_STRING_VALUE> ...]
    [--esn <EXTRA_KEY> ...]
    [--ez <EXTRA_KEY> <EXTRA_BOOLEAN_VALUE> ...]
    [--ei <EXTRA_KEY> <EXTRA_INT_VALUE> ...]
    [--el <EXTRA_KEY> <EXTRA_LONG_VALUE> ...]
    [--ef <EXTRA_KEY> <EXTRA_FLOAT_VALUE> ...]
    [--eu <EXTRA_KEY> <EXTRA_URI_VALUE> ...]
    [--ecn <EXTRA_KEY> <EXTRA_COMPONENT_NAME_VALUE>]
    [--eia <EXTRA_KEY> <EXTRA_INT_VALUE>[,<EXTRA_INT_VALUE...]]
        (mutiple extras passed as Integer[])
    [--eial <EXTRA_KEY> <EXTRA_INT_VALUE>[,<EXTRA_INT_VALUE...]]
        (mutiple extras passed as List<Integer>)
    [--ela <EXTRA_KEY> <EXTRA_LONG_VALUE>[,<EXTRA_LONG_VALUE...]]
        (mutiple extras passed as Long[])
    [--elal <EXTRA_KEY> <EXTRA_LONG_VALUE>[,<EXTRA_LONG_VALUE...]]
        (mutiple extras passed as List<Long>)
    [--efa <EXTRA_KEY> <EXTRA_FLOAT_VALUE>[,<EXTRA_FLOAT_VALUE...]]
        (mutiple extras passed as Float[])
    [--efal <EXTRA_KEY> <EXTRA_FLOAT_VALUE>[,<EXTRA_FLOAT_VALUE...]]
        (mutiple extras passed as List<Float>)
    [--esa <EXTRA_KEY> <EXTRA_STRING_VALUE>[,<EXTRA_STRING_VALUE...]]
        (mutiple extras passed as String[]; to embed a comma into a string,
         escape it using "\,")
    [--esal <EXTRA_KEY> <EXTRA_STRING_VALUE>[,<EXTRA_STRING_VALUE...]]
        (mutiple extras passed as List<String>; to embed a comma into a string,
         escape it using "\,")
    [-f <FLAG>]
    

    例如,您可以通过以下方式发送 int 值:

    --ei int_key 0
    

    【讨论】:

      【解决方案4】:

      要记住的另一件事:Android 8 限制了可以通过清单(例如,静态)注册的接收器

      https://developer.android.com/guide/components/broadcast-exceptions

      【讨论】:

        【解决方案5】:

        正如许多人已经注意到的那样,只有当额外的字符串包含空格时,问题才会出现。

        根本原因是 OP 的主机 OS/shell(即 Windows/cmd.exe)破坏了输入的命令 - " 字符丢失,--es sms_body "test from adb" 变为 --es sms_body test from adb。这导致sms_body 字符串额外被分配test 的值,而字符串的其余部分成为&lt;URI&gt;|&lt;PACKAGE&gt;|&lt;COMPONENT&gt; 说明符。

        为了避免所有你可以使用的:

        adb shell "am broadcast -a com.whereismywifeserver.intent.TEST --es sms_body 'test from adb' -n com.whereismywifeserver/.IntentReceiver"
        

        或者先启动交互式adb shell 会话,然后从其中运行am broadcast 命令。

        【讨论】:

          【解决方案6】:

          在这里记下我的情况可能对某人有用,

          我必须向 Android P 中的广播接收器发送具有多个 Intent 附加功能的自定义 Intent,

          细节是,

          收件人姓名:com.hardian.testservice.TestBroadcastReceiver

          意图action = "com.hardian.testservice.ADD_DATA"

          额外的意图是,

          1. "text"="测试味精",
          2. “来源”= 1,

          在命令行中运行以下命令。

          adb shell "am broadcast -a com.hardian.testservice.ADD_DATA --es text 'test msg' --es source 1 -n com.hardian.testservice/.TestBroadcastReceiver"
          

          希望这会有所帮助。

          【讨论】:

            【解决方案7】:

            我遇到了同样的问题,发现你必须在额外的地方转义空格:

            adb shell am broadcast -a com.whereismywifeserver.intent.TEST --es sms_body "test\ from\ adb"
            

            所以应该是“test\from\adb”而不是“test from adb”

            【讨论】:

              【解决方案8】:

              使用带有隐式接收器限制的 Android 8 及更高版本,您应该在终端命令的末尾添加应用程序的包名称:

              adb shell am broadcast -a my.app.package.TEST my.app.package
              

              如果您的软件包在调试模式下有后缀,请改用my.app.package.debug

              【讨论】:

              • 谢谢!!我在命令末尾添加了包名称,它开始工作)))
              【解决方案9】:

              我不确定是否有人在获取整个字符串“从 adb 测试”时遇到问题。在空格前面使用转义字符对我有用。

              adb shell am broadcast -a com.whereismywifeserver.intent.TEST --es sms_body "test\ from\ adb" -n com.whereismywifeserver/.IntentReceiver
              

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2014-01-13
                • 1970-01-01
                • 1970-01-01
                • 2012-03-29
                相关资源
                最近更新 更多