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 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謹製アプリとか)
気をつけましょう。
以上、こんな力技で起動してみました。
全く関係ないアプリから、違うアプリの設定画面を開いていたりしたので、不思議だったんですがそういった所に使われている様です。