作者qrtt1 (null)
看板AndroidDev
标题[分享] am 与 broadcast intent
时间Mon Aug 1 21:09:37 2011
网页版:
http://www.javaworld.com.tw/jute/post/view?bid=26&id=299312&sty=1
最近在开发时需测试一些 component 的运作,
并不是测试 UI 会不会被按挂,
也不是要测某个逻辑单元有没有写好。
所以,test monkey 与 unit test 都不是那麽合适的工具。
这种时候就得『突发奇想』,设法完成大量的测试,
以增加在真实的使用流程里将 App 弄死的机会。
以 player component 来说,我们会提供一些 url 让 component 去试播,
这样的 component 单纯就只需要建立 player instance 再指定 SurfaceView。
最初的 demo activity 会在 onCreate 时,
直接 hardcode 一个 url,它一起来就播放了。
若是我们要给它不定数量的 url 似乎又得重编跟指定,或是放个 playlist。
但怎麽想,这都跟最原始单纯的 demokit 的用途有所差距。
我们应该想另一个办法,App 按装上去後,
我们能下指令使它开始播放指令的 url。
只要能做到透过指令在外部控制 App 一切都会方便许多。
那麽有那些方案呢?
*. 埋个 tcp server 收 command
(实在太麻烦了)
*. 弄个 text view 还有 button 给 monkey script 输入
(似乎又给自己找了更多的麻烦)
*. 弄另一个 App 发 intent 给 demo-kit
(那还不是要重编程式,又回到如何由外部控制的问题了。鬼打墙)
虽然想过了许多方案,不过想想最後一个点子其实还不错,
在模糊的印象中 Android 有个 am 指令能在 adb shell 下启动 App。
而启动 App 其实就是向某个对象发送 intent 的行为,
因此推测它也可能有 broadcast intent 的能力。
直接进 adb shell 查询 am 的使用说明:
qty:~ qrtt1$ adb shell
$ am
usage: am [subcommand] [options]
start an Activity: am start [-D] [-W] <INTENT>
-D: enable debugging
-W: wait for launch to complete
start a Service: am startservice <INTENT>
send a broadcast Intent: am broadcast <INTENT>
start an Instrumentation: am instrument [flags] <COMPONENT>
-r: print raw results (otherwise decode REPORT_KEY_STREAMRESULT)
-e <NAME> <VALUE>: set argument <NAME> to <VALUE>
-p <FILE>: write profiling data to <FILE>
-w: wait for instrumentation to finish before returning
start profiling: am profile <PROCESS> start <FILE>
stop profiling: am profile <PROCESS> stop
start monitoring: am monitor [--gdb <port>]
--gdb: start gdbserv on the given port at crash/ANR
<INTENT> specifications include these flags:
[-a <ACTION>] [-d <DATA_URI>] [-t <MIME_TYPE>]
[-c <CATEGORY> [-c <CATEGORY>] ...]
[-e|--es <EXTRA_KEY> <EXTRA_STRING_VALUE> ...]
[--esn <EXTRA_KEY> ...]
[--ez <EXTRA_KEY> <EXTRA_BOOLEAN_VALUE> ...]
[-e|--ei <EXTRA_KEY> <EXTRA_INT_VALUE> ...]
[-n <COMPONENT>] [-f <FLAGS>]
[--grant-read-uri-permission] [--grant-write-uri-permission]
[--debug-log-resolution]
[--activity-brought-to-front] [--activity-clear-top]
[--activity-clear-when-task-reset] [--activity-exclude-from-recents]
[--activity-launched-from-history] [--activity-multiple-task]
[--activity-no-animation] [--activity-no-history]
[--activity-no-user-action] [--activity-previous-is-top]
[--activity-reorder-to-front] [--activity-reset-task-if-needed]
[--activity-single-top]
[--receiver-registered-only] [--receiver-replace-pending]
[<URI>]
果真发现了好东西:
send a broadcast Intent: am broadcast <INTENT>
有了这些讯息,那就直接在 onCreate 时,
除了 demokit 原本的动作之外,再多注册个 broadcast receiver:
receiver = new BroadcastReceiver()
{
@Override
public void onReceive(Context context, Intent intent)
{
Bundle bundle = intent.getExtras();
if(bundle != null && bundle.containsKey("u"))
{
player.openMedia(bundle.getString("u"));
}
}
};
/* 记得要 unregister 它呦 */
registerReceiver(receiver, new IntentFilter("demokit.stub"));
这麽做,在平时的时候 demokit 的行为都一样,开了就播。
而透过 broadcast receiver 我们得到重新指定播放内容的功能:
$ am broadcast -a demokit.stub -e u rtsp://streaming.o2active.cz/o2tvinfo_med
Broadcasting: Intent { act=demokit.stub (has extras) }
Broadcast completed: result=0
使用 -a 指定 action name,并加上 -e 指定参数 key 为 u 空一个填上 value。
後续再配合 python 动态产生 adb command 并分折程式 log 协助产生大量测试的结果。
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 61.231.49.56
※ 编辑: qrtt1 来自: 61.231.49.56 (08/01 21:10)
※ 编辑: qrtt1 来自: 61.231.49.56 (08/01 21:13)
1F:推 nvidia:赞 08/01 23:10
2F:推 ajujgrua:+1 08/01 23:34
3F:推 diousk:好物! 08/02 00:46
4F:推 tomap41017:+1 08/03 00:13
5F:推 milochen:+1 08/03 18:42