ターミナルからIntentを投げる


ターミナルから端末、もしくはエミュレータに対してIntentを投げることが可能です。

アプリケーションの開発を行っていると、ブロードキャストインテントなど特定のタイミングにしか飛んでこないIntent(端末起動時のBOOT_COMPLETE)や、暗黙のIntentに反応させたいということがあるかと思います。
そういったときに、ターミナルからIntentを投げることができれば非常に便利です。

今回は、比較的よく使われると思われる以下の3つの方法について解説します。

  • 明示的Intent
  • ブロードキャストIntent
  • 暗黙的Intent

amコマンド
ターミナルからIntentを投げるには、amコマンドを使用します。
今回は、PC上でエミュレータを起動している状態を想定して解説を行いますが、実機の場合でも特に違いはありません。
それでは早速使ってみましょう。まずはターミナルを起動してください(windowsならコマンドプロンプト)。
以下のように入力し、端末にアクセスしましょう。
$ adb shell
ターミナル上に$ <カーソル>だけ表示されていれば成功です。
それではまず、amコマンドのhelpを見てみましょう。コマンドの使い方やオプションの種類などを知りたいときに使います。
ターミナルに以下のように入力してください。
$ am
すると以下のように表示されるかと思います(androidのバージョンによって多少誤差があります)。

それでは、主な使い方を順に解説します。

明示的Intentを投げる
それではまず初めに、明示的Intentを投げる方法について解説します。
例えば、以下のように使用します(今回はあらかじめ※APIDemosをエミュレータにインストールしています)。
# am start -n com.example.android.apis/.ApiDemos
このコマンドをターミナルに打ち込みましょう。
ターミナルに以下のように表示され、あらあじめインストールしておいたApiDemosのApiDemosアクティビティが起動すれば成功です。

フォーマットは以下のようにします。
$ am start -n <起動したいアプリケーションのパッケージ名>/.<Activity名>>
ここで例えばオプションを入力していなかったりすると、以下のようにエラーが表示されます。
(一例)

明示的Intentについては「Intentを使って画面を遷移する(明示的Intent)」の記事を参考にしてください。

※ApiDemos・・・各種APIがサンプルアプリケーションという形でSDK内に梱包されているものです。APIの使い方を学ぶのに良いと思いますので試してみてください。プロジェクト作成時に以下のフォルダを指定します。
/<android-sdkルート>/samples/android-XX/ApiDemos

暗黙的Intentを投げる

次は暗黙的Intentの投げ方を解説します。
ここでは例として、暗黙的Intentを利用してブラウザを起動させてみたいと思います。
# am start -a android.intent.action.VIEW -d https://techbooster.org/
とすると、ターミナルにて以下のように表示され、端末側でブラウザ(もしくはブラウザ選択ダイアログ)が起動し、Tech Boosterが表示されるかと思います。


暗黙的Intentは、URLをタップしたり、共有ボタンを押してみたりと、特定のアプリケーションの特定の操作でしか発行することはできないので、意図的に必要な暗黙的Intentを投げることができれば便利です。
ちなみに、フォーマットは以下のようにします。
$ am start -a <ACTION> -d <DATA_URL>

せっかくなのでもう一つ例を示します。「Intent.ACTION_SENDで他のアプリケーションと連携する」の記事に登場するACTION_SENDを指定して、共有アプリ一覧を呼び出してみましょう。以下を入力してみてください。
$ am start -a android.intent.action.SEND -t “text/plain” -c “android.intent.category.DEFAULT”
するとターミナルに以下のように表示され、端末上に共有アプリ一覧が表示されれば成功です。


※こちらは実機(Nexus S)の画面キャプチャです。

フォーマットは以下のようになっています。
$ am start -a <ACTION> -t <MIME_TYPE> -c <CATEGORY>
暗黙的Intentについては「Intentを使ってアプリを連携させる(暗黙的Intent)」「Intent.ACTION_SENDで他のアプリケーションと連携する」の記事を参考にしてください。

ブロードキャストIntentを投げる
ここでは、ターミナルからブロードキャストIntentを投げる方法を解説します。
ここでは例として、バッテリーが少なくなってきたときに発行されるブロードキャストインテントを投げてみます。
# am broadcast -a android.intent.action.BATTERY_LOW
ターミナル上に以下のように表示され、端末上に「充電して下さい」ダイアログが表示されれば成功です。


本来は電池が少なくなったときにしか表示されませんが、ターミナルからIntentを投げることで、意図的に実現させることが可能です。


フォーマットは以下の通りにします。
# am broadcast -a <ACTION>

adb shellコマンドについて

最後に、adb shellコマンドについて触れておきます。
端末やエミュレータにターミナル上から接続したい場合、コマンドラインから以下のコマンドを打ち込むことで、端末に接続(アクセス)することができます。
$ adb shell
端末に接続することで、端末内のディレクトリ操作(cdやlsコマンド)や、今回のように端末に対してIntentを投げるなど、コマンドを用いた端末操作が可能になります。
ただし、端末とエミュレータ合わせて複数台がPC上で起動もしくは接続されている場合は、上記コマンドでは「error: more than one device and emulator」と表示されるでしょう。
この場合は次のようにする必要があります。
1.$ adb devicesコマンドにてデバイスリスト取得(「adbを使いこなす」参照)
2.$ adb -s <デバイス> shell で選択したデバイスに接続
<デバイス>には、デバイスリストの「device」の左に表示される文字列を指定します。

以上、端末への接続( アクセス)について簡単に説明しました。

今回は、主に以下の3つについて、基本的なamコマンドの使い方について解説しました。

  • 明示的Intent
  • ブロードキャストIntent
  • 暗黙的Intent

オプションなどを駆使すれば、快適なIntent生活を送る事ができるのではないでしょうか。
いろいろ試してみて下さい。