Intentで画面遷移する(暗黙的Intent)/Getting started


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が保持する事ができる主要な情報はactiondataの2つがあります。

種類説明
action実行するアクション(動作)を指定します。 ACTION_VIEW, ACTION_CALL
data作用するためのデータを指定します。型はURIです。content://contacts/people/1 , tel:123456789

上記actionとdataを組み合わせて、様々な情報を別アプリケーションへ通知することができます。

更に、第2属性として以下の4つを追加することもできます。

種類説明
categoryactionを実行する際の追加情報です。 CATEGORY_LAUNCHER, CATEGORY_ALTERNATIVE
typeIntentが保持するデータのMIMEのタイプを明確にします。vnd.android.cursor.item/phone, */*
componentコンポーネントクラスの名前を明確にします。
extrasその他追加情報です。メールを送るactionの場合、subject, body等が追加できる。

作りたいアプリケーションに応じて、様々な情報を組み合わせてみてくださいね