Intentを使ってアプリを連携させる(暗黙的Intent)


Intentを使って画面を遷移する(明示的Intent)では同一アプリケーション内での画面遷移をIntentで行いました。
今回は暗黙的Intentを使って、他アプリケーションを呼び出してみます。

暗黙的Intentは、所定の動作(たとえばブラウザを起動)のみ指定してアプリケーションを起動します。
起動される側のアプリケーションは、反応したいイベント(ブラウザでURLを表示する、というAction)に対して返事をします。

明示的Intentで単純に標準の「ブラウザ」アプリケーションを指定しても、Webを見るという動作は実現できます。
標準アプリケーションを使っていれば一見問題無いように思えますが、利用者は好きなアプリケーションを選べなくなってしまいます。
(またブラウザが入っていないシステムでは、残念ながら動かないでしょう。)

暗黙的IntentはAction(動作)を指定して起動対象を決めることで、アプリケーションが緩やかに連携します。
一見回りくどいように見えますが、明示的に指定するより、アプリケーション間の連携が格段に行いやすくなっています。

それでは、サンプルコードで確認してみましょう。

public class sendintentActivity extends Activity implements OnClickListener {

	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);

        //buttonを取得
        Button btn = (Button)findViewById(R.id.Button01);
        btn.setOnClickListener(this);
    }

	public void onClick(View v) {
		// TODO 自動生成されたメソッド・スタブ
    	Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse("https://techbooster.org/"));

    	startActivityForResult(intent,MY_INTENT_BROWSER);
	}

onClickメソッドの中で暗黙的インテントを送ります。今回はURLを引数としてブラウザに渡します。
ACTION_VIEWに対応しているアプリケーションがあれば標準ブラウザ以外でも受け取ることが出来ます。
選択肢が複数ある場合、利用者が起動するアプリケーションを選択できます。

以下はどちらもインテントでActivityを開始できますが、返値の必要性に応じて、Intent起動メソッドを使い分けることもできます。

  • startActivityForResult(Intent, Int)
  • startActivity(Intent)

なお、startActivityForResult(Intent, Int)の第2引数Intは正でなければなりません。
負値を指定した場合、startActivity(Intent)と同じ挙動になり、返り値が通知されないからです。
今回は、返り値処理も仮実装しています。

    public void onActivityResult(int requestCode, int resultCode, Intent intent) {

    	//返り値の取得
	    if (requestCode == MY_INTENT_BROWSER) {

	        if (resultCode == RESULT_OK) {
	        	// Success
	        } else if (resultCode == RESULT_CANCELED) {
	            // Handle cancel
	        }
	    }
    }
}

onActivityResultの第1引数requestCodeはstartActivityForResult(Intent, Int)の第2引数です。
複数のIntentからonActivityResultを呼び出されるケースがあるので、第1引数requestCodeで使い分けます。

また、暗黙的インテントで呼び出したアクティビティが終了した場合や、BACKキーを押した場合は、
自分の呼び出し元のアクティビティに戻ってきます(。その際、onActivityResultに実行結果が返ります)。

4 Comments