71
82

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

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

Last updated at Posted at 2014-05-31

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謹製アプリとか)
気をつけましょう。

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

71
82
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
71
82

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?