use*_*655 43 android adb broadcastreceiver android-intent
我有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();
}
}
}
Run Code Online (Sandbox Code Playgroud)
而且在清单中:
<receiver android:name="com.whereismywifeserver.IntentReceiver" android:enabled="true">
<intent-filter android:priority="999">
<action android:name="com.whereismywifeserver.intent.TEST"/>
</intent-filter>
</receiver>
Run Code Online (Sandbox Code Playgroud)
但是当我尝试从adb发送意图时,我收到错误:
C:\Users\i.yesilevsky>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.whereismywifeser
ver.IntentReceiver} does not exist.
Run Code Online (Sandbox Code Playgroud)
当我在代码中创建意图时,一切正常.那么如何从adb发送意图?
Zoh*_*han 80
您无需指定接收器.您可以改用adb.
adb shell am broadcast -a com.whereismywifeserver.intent.TEST
--es sms_body "test from adb"
Run Code Online (Sandbox Code Playgroud)
有关更多参数(如整数附加项),请参阅文档.
use*_*655 27
我发现命令错误,正确的命令包含"广播"而不是"开始":
adb shell am broadcast -a com.whereismywifeserver.intent.TEST --es sms_body "test from adb" -n com.whereismywifeserver/.IntentReceiver
Run Code Online (Sandbox Code Playgroud)
Cal*_*Che 10
从ADB命令发送广播的真实方法是:
adb shell am broadcast -a com.whereismywifeserver.intent.TEST --es sms_body "test from adb"
Run Code Online (Sandbox Code Playgroud)
并且,-a意味着ACTION,--es意味着额外发送String。
PS。您还可以通过指定其他参数来发送其他数据类型,例如:
[-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>]
Run Code Online (Sandbox Code Playgroud)
例如,您可以通过以下方式发送int值:
--ei int_key 0
Run Code Online (Sandbox Code Playgroud)
ult*_*aon 10
使用添加了隐式接收器限制的 Android 8 及更高版本,您应该在终端命令末尾添加应用程序的包名称:
adb shell am broadcast -a my.app.package.TEST my.app.package
Run Code Online (Sandbox Code Playgroud)
如果您的包在调试模式下有后缀,请改用my.app.package.debug。
正如许多人已经注意到的那样,只有当额外的字符串包含空格时,问题才会显现出来。
根本原因是OP的主机操作系统/shell(即Windows/cmd.exe)破坏了输入的命令 - 字符"丢失,--es sms_body "test from adb"变成--es sms_body test from adb. 这导致sms_body字符串 extra 被分配了值,test而字符串的其余部分成为<URI>|<PACKAGE>|<COMPONENT>说明符。
为了避免所有这些,你可以使用:
adb shell "am broadcast -a com.whereismywifeserver.intent.TEST --es sms_body 'test from adb' -n com.whereismywifeserver/.IntentReceiver"
Run Code Online (Sandbox Code Playgroud)
或者首先启动交互式adb shell会话并am broadcast从其中运行命令。
要记住的另一件事:Android 8 限制了可以通过清单注册的接收器(例如,静态)
https://developer.android.com/guide/components/broadcast-exceptions
记下我在这里的情况可能对某人有用,
我必须将具有多个意图附加功能的自定义意图发送到 Android P 中的广播接收器,
详细信息是,
收件者姓名:com.hardian.testservice.TestBroadcastReceiver
意图action = "com.hardian.testservice.ADD_DATA"
意图额外是,
在命令行中运行以下命令。
adb shell "am broadcast -a com.hardian.testservice.ADD_DATA --es text 'test msg' --es source 1 -n com.hardian.testservice/.TestBroadcastReceiver"
Run Code Online (Sandbox Code Playgroud)
希望这可以帮助。
我遇到了同样的问题,发现你必须在额外的空间中转义:
adb shell am broadcast -a com.whereismywifeserver.intent.TEST --es sms_body "test\ from\ adb"
Run Code Online (Sandbox Code Playgroud)
因此,它应该是“test\ from\ adb”,而不是“test from adb”
| 归档时间: |
|
| 查看次数: |
83429 次 |
| 最近记录: |