2011年9月21日水曜日

Explicit IntentとImplicit Intent

Explicit IntentとImplicit Intent

IntentはExplicit IntentとImplicit Intentの2種類に分けられます。
このような分類や議論は設計上での話です。プログラマーの立場から見れば、Intentの引数に与える値が異なる、という話になります。「Explicit」といったコマンドがあるのではありません。

Explicit Intentについて
Explicit Intentは、起動させるアプリを明示するIntentです。プログラムの書き方としては、パッケージ名とクラス名とを引数にします。

これは、自分のアプリ内のActivityやServiceを起動するために使います。

また、他のアプリのパッケージとクラスを指定すれば、(指定したアプリが稼働していない状態であっても)そのアプリのそのクラスを起動できます。

自分のアプリ内のを起動する方法については、他の多くのサイトで紹介されています。Bound Servicesはその例です。
書き方の例を次に示します。この例は自分のアプリ内のLocalServiceというクラスを起動します。第一引数のthisは自分のアプリを指します。第二引数は自分のアプリ内のクラスを指します。

Intent intent = new Intent(this, LocalService.class);

自分以外のアプリ(他のアプリを)起動する書き方の例は次のとおりです。setClassNameメソッドの第一引数はパッケージ名です。第二引数はそのパッケージに含まれるクラスです。
Intent i;
i = new Intent();
i.setClassName(
"jp.Androyer.ReceiveIntent",
"jp.Androyer.ReceiveIntent.ReceiveService");
i.putExtra(Intent.EXTRA_TEXT, "Intent Send");
try{
startService(i);
}
catch(ActivityNotFoundException e){
Toast.makeText(this, "Error", Toast.LENGTH_LONG).show();
}

Implicit Intentについて
Implicit Intentは、起動させるアプリを明示せず、行いたい行動を指定するIntentです。
この用語は、アプリを設計する場面で使う用語です。アプリを利用する場面では、これを「共有」と呼んでいます。

Implicit Intentが発行されると、アンドロイドシステムは、指定された行動を行えるアプリの一覧を作成し、これを利用者に提示します。利用者は、この一覧の中から1個のアプリを選択します。
書き方は次のとおりです。
Intent i, i2;
i = new Intent();
i.setAction(Intent.ACTION_SEND);
i.setType("text/plain");
i.putExtra(Intent.EXTRA_TEXT, "Intent Send");
i2 = Intent.createChooser(i, "選択してください");
try{
startService(i2);
}
catch(ActivityNotFoundException e){
Toast.makeText(this, "Error", Toast.LENGTH_LONG).show();
}

intent-filter
Implicit Intentが行っているのは「指定した行動を行えるアプリを起動せよ」という指示だけであり、具体的にどのアプリを起動させるのかまでは指示しません。Intentの引数にはパッケージ名やクラス名が指定されていないのです。

Implicit Intentは指示を発する側の仕掛けです。この指示を受けて、起動するアプリを探し求める仕掛けが必要になります。
アンドロイドシステムは、指定された行動を行えるアプリがどれだけ端末にインストールされているのかを知っておかなければなりません。また、起動されるアプリ側でも、自分はどのような行動を行えるのかをアンドロイドシステムに通知しておかなければなりません。

自分が行える行動をアンドロイドシステムに通知する仕掛けが、intent-filterです。これはAndroidManifest.xmlの<intent-filter>に書きます。
filterとは、ろ過するという意味ですが、Intentをろ過して、取捨選択して、指示内容に合致したIntentだけを取り扱う、というような仕掛けになっています。

起動について
ここでは話を簡単にするため、一言で「起動」と表現しています。詳しくは、Intentにより起動されるタイミングをご覧ください。

用語の翻訳について
他のサイトでは、Implicitを「暗黙の」と翻訳されています。
私がこの勉強を始めた頃、「暗黙の」と訳された日本語の解説をあちこちで読みましたが意味が理解できませんでした。そのため、英語の原文を読んだのです。このような経緯から、私の記事では、原文のまま、Implicit Intentと表記しています。
Implicit Intentを「(起動するアプリを)明示しないIntent」と翻訳しても、間違ってはいないと思います。
なお、Implicitという言葉とExplicitという言葉は、反意語の関係にあります。Explicitという言葉は、「明白な」、「はっきりした」という意味があります。

0 件のコメント:

コメントを投稿