Intentで画面遷移する(明示的Intent)/Getting startedでは、同一アプリケーション内での画面遷移をIntentで行いました。
今回は暗黙的Intentを使って、他アプリケーションを呼び出してみます。
暗黙的Intentは、所定の動作(例:ブラウザを起動)のみ指定してアプリケーションを起動します。
起動される側のアプリケーションは、反応したいイベント(ブラウザでURLを表示する、というAction)に対して返事をします。
明示的Intentで単純に標準の「ブラウザ」アプリケーションを指定しても、Webを見るという動作は実現できます。
標準のアプリケーションを使っていれば一見問題無いように思えますが、利用者は好きなアプリケーションを選べなくなってしまいます。
(※また、ブラウザが入っていないシステムでは、残念ながら動かないでしょう。)
暗黙的IntentはAction(動作)を指定して起動対象を決めることで、アプリケーションが緩やかに連携します。
一見回りくどいように見えますが、明示的に指定するより、アプリケーション間の連携が格段に行いやすくなっています。
暗黙的Intentで重要なメソッドは次の3つです。
メソッド名 | 説明 |
---|---|
IntentクラスのIntentメソッド | Intentの内容を設定。 |
ActivityクラスのstartActivityForResultメソッド | Intentでの情報の受け渡しを開始(返り値有り) |
ActivityクラスのstartActivityメソッド | Intentでの情報の受け渡しを開始(返り値無し) |
それでは、サンプルプログラムで確認してみましょう。
サンプルプログラム
暗黙的Intentを用いることで、様々なアプリケーションと連携することができます。
今回のサンプルプログラムでは、6種類のボタンを用意しました。
ボタン | 説明 |
---|---|
ブラウザボタン | ブラウザを起動し、本サイトのトップページへ接続する。 |
マップボタン | マップアプリを起動する。 |
マーケットボタン | マーケットアプリを起動する。 |
電話ボタン | 電話アプリを表示する。 |
文字列ボタン | 文字列を他アプリケーションへ受け渡す。 |
メールボタン | メーラーアプリを起動する。 |
イベントの設定
イベントを受け取る側のアプリケーションは、自分が受け取りたいイベントのみ反応します。
そのため、イベントを送る側のアプリケーションでは、送るイベントの種類を指定してあげる必要があります。
例えば、ブラウザを表示するイベントを設定するには、次のようにします。
new Intent(Intent.ACTION_VIEW,Uri.parse("https://techbooster.org/"));
IntentクラスのIntentメソッドの第1引数で、アクションの種類を指定します。
そして第2引数には、ブラウザで表示したいサイトのURLを指定します。
今回は、本サイトのトップページを表示するように指定しています。
他にも、様々なイベントがあります。
イベント | 指定方法 |
---|---|
ブラウザを起動 | intent = new Intent(Intent.ACTION_VIEW, Uri.parse("http://techbooster.jpn.org/")); |
マップを起動 | intent = new Intent(Intent.ACTION_VIEW,Uri.parse("geo:0,0?q=Osaka")); |
マーケットでアプリを検索 | intent = new Intent(Intent.ACTION_VIEW, Uri.parse("market://search?q=pname:goodMorningTweet")); |
マーケットでアプリの詳細を表示 | intent = new Intent(Intent.ACTION_VIEW, Uri.parse("market://details?id=com.udg.goodmorning.tweet")); |
アプリケーションをアンインストール | intent = new Intent(Intent.ACTION_DELETE, Uri.fromParts("package", , null)); |
ダイヤラー(電話)を起動 | intent = new Intent(Intent.ACTION_VIEW, Uri.parse("tel:")); |
文字列を受け渡す | intent.setAction(Intent.ACTION_SEND); intent.setType("text/plain"); intent.putExtra(Intent.EXTRA_TEXT, "文字列"); |
メーラーを起動 | intent = new Intent(Intent.ACTION_SENDTO, Uri.parse("mailto:")); intent.putExtra(Intent.EXTRA_SUBJECT, "タイトル"); intent.putExtra(Intent.EXTRA_TEXT, "本文"); |
Intentメソッドを用いて、受け渡すイベントを指定しました。
次に、イベントの受け渡しを開始するには、以下のいずれかのメソッドを用います。
- startActivityForResult(Intent, Int)
- startActivity(Intent)
startActivityForResultメソッドとstartActivityメソッドのどちらもインテントでActivityを開始できますが、返値の必要性に応じて、Intent起動メソッドを使い分けることもできます。
なお、startActivityForResult(Intent, Int)の第2引数Intは正でなければなりません。
負値を指定した場合、startActivity(Intent)と同じ挙動になり、返り値が通知されないからです。
返り値処理を実装するには、次のようにします。
■src/
public void onActivityResult(int requestCode, int resultCode, Intent intent) { //返り値の取得 if (resultCode == RESULT_OK) { // Success Log.d("IntentSample", "success"); } else if (resultCode == RESULT_CANCELED) { // Handle cancel Log.d("IntentSample", "canceled"); } }
onActivityResultメソッドの第1引数requestCodeはstartActivityForResult(Intent, Int)の第2引数です。
複数のIntentからonActivityResultメソッドが呼び出されるケースがあるので、第1引数requestCodeで使い分けます。
また、暗黙的インテントで呼び出したアクティビティが終了した場合や、BACKキーを押した場合は、
自分の呼び出し元のアクティビティに戻ってきます。(その際、onActivityResultに実行結果が返ります)。
Intentの受け渡しの開始からonActivityResultへ実行結果が返ってくる流れは、次の図のようになります。
それでは、全体のサンプルプログラムを見てみましょう。
■src/SendIntentActivity.java
public class SendIntentActivity extends Activity{ static final int MY_INTENT_BROWSER = 0; /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); } public void onClick(View v) { Intent intent = null; switch (v.getId()) { case (R.id.button_brows): intent = new Intent(Intent.ACTION_VIEW, Uri.parse("https://techbooster.org/")); break; case (R.id.button_map): intent = new Intent(Intent.ACTION_VIEW, Uri.parse("geo:0,0?q=Osaka")); break; case (R.id.button_market): intent = new Intent(Intent.ACTION_VIEW, Uri.parse("market://details?id=com.udg.goodmorning.tweet")); break; case (R.id.button_dial): intent = new Intent(Intent.ACTION_VIEW, Uri.parse("tel:123456789")); break; case (R.id.button_string): intent = new Intent(); intent.setAction(Intent.ACTION_SEND); intent.setType("text/plain"); intent.putExtra(Intent.EXTRA_TEXT, ""トゥットゥルー"); break; case (R.id.button_mail): intent = new Intent(Intent.ACTION_SENDTO, Uri.parse("mailto:")); intent.putExtra(Intent.EXTRA_SUBJECT, "タイトル"); intent.putExtra(Intent.EXTRA_TEXT, "トゥットゥルー"); break; } if (intent != null) startActivityForResult(intent, MY_INTENT_BROWSER); } public void onActivityResult(int requestCode, int resultCode, Intent intent) { // 返り値の取得 if (requestCode == MY_INTENT_BROWSER) { if (resultCode == RESULT_OK) { // Success Log.d("IntentSample", "success"); } else if (resultCode == RESULT_CANCELED) { // Handle cancel Log.d("IntentSample", "canceled"); } } } }
9~42行目のonClickメソッドの中で各イベントを設定し、暗黙的インテントを送ります。
各ボタンに設定されたイベント
14~15行目:ブラウザボタン
intent = new Intent(Intent.ACTION_VIEW, Uri.parse("https://techbooster.org/"));
ブラウザボタンを選択すると、インストールされているブラウザアプリのリストが表示され、使いたいブラウザアプリを選択すると、本サイトのトップページヘアクセスします。
選択肢が複数ある場合、利用者が起動するアプリケーションを選択できます。
18~19行目:マップボタン
intent = new Intent(Intent.ACTION_VIEW, Uri.parse("geo:0,0?q=Osaka"));
マップボタンを選択すると、GoogleMapのアプリケーションが起動します。
ここでは、大阪府大阪市に中心がくるよう、設定しています。
22~23行目:マーケットボタン
intent = new Intent(Intent.ACTION_VIEW, Uri.parse("market://details?id=com.udg.goodmorning.tweet"));
マーケットボタンを選択すると、アプリマーケットのアプリケーションが起動します。
アプリマーケットのアプリケーションで、指定されたアプリケーションの詳細情報が表示されます。
26行目:電話ボタン
intent = new Intent(Intent.ACTION_VIEW, Uri.parse("tel:123456789"));
電話ボタンを選択すると、ダイヤラーアプリ(電話のアプリ)が起動します。
ダイヤラーアプリが起動し、指定された番号が入力された状態になります。
29~32行目:文字列ボタン
intent = new Intent(); intent.setAction(Intent.ACTION_SEND); intent.setType("text/plain"); intent.putExtra(Intent.EXTRA_TEXT, ""トゥットゥルー");
文字列ボタンを選択すると、文字列を受け取る事ができるアプリケーションが起動します。(例:twitterアプリやメーラーアプリなど)
一般的に、文字列を受け取ることができるアプリケーションは多数あるため、リストからアプリケーションを選択します。
35~37行目:メールボタン
intent = new Intent(Intent.ACTION_SENDTO, Uri.parse("mailto:")); intent.putExtra(Intent.EXTRA_SUBJECT, "タイトル"); intent.putExtra(Intent.EXTRA_TEXT, "トゥットゥルー");
メールボタンを選択すると、メーラーアプリが起動します。
36行目でメールのタイトル、37行目でメールの本文を指定しています。
他にも、様々なイベントがあります。
Intentで保持できる情報
Intentが保持する事ができる主要な情報はactionとdataの2つがあります。
種類 | 説明 | 例 |
---|---|---|
action | 実行するアクション(動作)を指定します。 | ACTION_VIEW, ACTION_CALL |
data | 作用するためのデータを指定します。型はURIです。 | content://contacts/people/1 , tel:123456789 |
上記actionとdataを組み合わせて、様々な情報を別アプリケーションへ通知することができます。
更に、第2属性として以下の4つを追加することもできます。
種類 | 説明 | 例 |
---|---|---|
category | actionを実行する際の追加情報です。 | CATEGORY_LAUNCHER, CATEGORY_ALTERNATIVE |
type | Intentが保持するデータのMIMEのタイプを明確にします。 | vnd.android.cursor.item/phone, */* |
component | コンポーネントクラスの名前を明確にします。 | |
extras | その他追加情報です。 | メールを送るactionの場合、subject, body等が追加できる。 |
作りたいアプリケーションに応じて、様々な情報を組み合わせてみてくださいね