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に実行結果が返ります)。