Edited at

外部アプリ起動Intent発行まとめ

More than 5 years have passed since last update.


Intentとは何か?

アプリ間でデータの受け渡し、連携が出来るAndroidの仕組み。

端末内では、色んなIntentが発行されている。

例えば・・・

・バッテリーの値が変化した

・充電器が接続された

・端末の電源が入った

・端末のロックを解除した

・ブラウザで〇〇ってページ開いてー

・こんな形式のファイル開けるアプリいない?

といったIntentが端末やアプリから発行されている

もちろん自作アプリで特定のIntentが送られた場合、それトリガーに何か処理を行うといった事も可能です。


暗黙的・明示的Intentとは?


暗黙的Intent

暗黙的Intentが発行された場合、発行した時点でそのIntentが受け取れるアプリ一覧が表示されます。

URLをタッチしたら、端末内のブラウザ一覧が表示されたことはありますよね?

あれは、暗黙的Intentが発行されています。

「誰かこのURL開けるアプリいない?」

「あ それ開けるわ」

「こっちもOK〜」

「無理ー!」

といったやり取り端末内があり、処理可能なアプリが一覧などに表示されるわけです。


明示的Intent

明示的Intentが発行された場合、特定のActivityやServiceにIntentを送ります。

Activity間で、値を受け渡したりする際に使用します。

class名まで指定してIntentを発行します。

どんな時に使うか

・自作したActivityを起動する

・自作アプリ間で連携をしたい

Intentの内容を明示指定し、1つの特定アプリに値を受け渡したり処理を促します。

これが明示的Intentです。

今回は自分が作成していないアプリ起動のIntentを発行してみます。


外部アプリ起動 Intent発行手順まとめ


そもそもアプリのclass名とかどうやって・・・

ある日、Logcatを見ながら電車に揺られていたのですが、ActivityManagerというTAGがついたLogが出力されていて気になったので色々実験してみました。

端末をPCに接続、EclipseのLogcat画面でLogを出力している状態にしてください。もしくはadb logcatしてください。

そして目立てのアプリを起動してください。

ここでLogをよく確認してみてください。

TAGにActivityManageというTAGがついたLogが出ています。

例えばGoogle+を起動してみます。

I/ActivityManager( 757): START u0 {act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] flg=0x10200000 cmp=com.google.android.apps.plus/.phone.HomeActivity bnds=[282,519][516,781]} from pid 1057

これが発行されているIntentの様です。

※ Nexus5で確認してます。


ActivityManagerのログからIntentを作成

act・cat・flg・cmpの = の後に注目してください。

act=android.intent.action.MAIN

cat=android.intent.category.LAUNCHER

flg=0x10200000

cmp=com.google.android.apps.plus/.phone.HomeActivity

bnds=[282,519]

bndsが何なのか、特定出来ていません。誰か知っている人がいたら教えてください

ログの内容を1つずつプログラムに当てはめていきます。

cmp=com.google.android.apps.plus/.phone.HomeActivity

ですが、/の後の「.」はcom.google.android.apps.plusが省略されてるということです。

AndroidManefest.xmlでActivityを定義する際にandroid:name=".MainAcitivity"

と記載するのと同じですね。


Intent.java

Intent intent = new Intent(Intent.ACTION_MAIN); //act

intent.setAction("android.intent.category.LAUNCHER") // cat
intent.setClassName("com.google.android.apps.plus",
"com.google.android.apps.plus.phone.HomeActivity"); // cmp 省略せずに書く
intent.setFlgs(0x10200000) //flgs ここはIntentの定数を使用するのがいい
startActivity(intent);

これでOKです。startActivityにIntentを渡すとGoogle+のActivityが起動します。

実行するとこんなログが出ていました。

I/ActivityManager( 757): START u0 {act=android.intent.action.MAIN flg=0x10200000 cmp=com.google.android.apps.plus/.phone.HomeActivity} from pid 20121

バージョンの違いによって起動するActivityが違う場合もあります。(Google謹製アプリとか)

気をつけましょう。

以上、こんな力技で起動してみました。

全く関係ないアプリから、違うアプリの設定画面を開いていたりしたので、不思議だったんですがそういった所に使われている様です。