参照:Intentを利用したデータ受け渡し
Activityによる画面遷移を行うIntentの仕組みでは,ファイルやデータベース(SQLite)などを介さず,データを受け渡す仕組みが用意されています.
画面遷移時に渡すデータは,Intentクラスのオブジェクトを作成した後,setData()やsetExtra()を用いて,別画面に送信するデータをセットします.
setData()メソッドは,主に暗黙的インテントで用いられることが想定されているため,Uri型の変数を引数とします.
setExtra()メソッドでは,任意のデータ(文字列や数値,それらの配列)を明示的インテントで別の画面(またはサービス)に送付することが想定されます.
setExtra()のString型の第一引数は,第二引数の値を識別するためのキーにあたります.
なお,setData(),setExtra()で送付できるデータ型に関しては,Intentクラスのドキュメントを参照して下さい.
別の画面(Activity)に遷移する場合は,別画面を呼び出すstartActivity()メソッドを呼ぶ前に上記のsetData()やsetExtra()を実行する処理を記述します.
呼び出された側の画面やサービスでは,getInten()によって得たIntent型のオブジェクトからgetXXXXExtra()メソッドを呼び出すことで,XXXXにあたるデータ型の値をsetExtra()で設定したキーを指定することで得ます.
このキーの値でどのようなデータ型を送受信するのかは,アプリの作成者間で決めなければなりません.
データの送受信のサンプル
Intentを利用したデータの受け渡しと画面遷移は,以下の図に示すような動作を行うサンプルにて示します.
まず,インテントを実行して別の画面を呼び出すActivityですが,上のボタンでテキストボックスに入力した文字列を別のActivityに送信します.
下のボタンとテキストボックス(電話番号入力をレイアウトXMLで指定)では,URIに電話アプリを立ち上げるようオブジェクトを生成してsetData()を実行しています.
URIの種類によって,暗黙的インテントを受けとるアプリケーションを指定することが可能です.
なお,各ボタンのクリックイベントを処理するメソッド(onActivityIntentButtonClick()とonTelIntentButtonClick())は,レイアウトXMLでボタンにonClick属性を加えて指定しています.
package jp.ac.bunkyo.a2dgames; import android.net.Uri; import android.os.Bundle; import android.app.Activity; import android.content.Intent; import android.text.SpannableStringBuilder; import android.view.Menu; import android.view.MenuItem; import android.view.View; import android.widget.EditText; public class IntentSendTest extends Activity { EditText text_input,tel_input; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_intent_send_test); text_input = (EditText)findViewById(R.id.intent_extra_string); tel_input = (EditText)findViewById(R.id.intent_tel_number); } @Override public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.intent_send_test, menu); return true; } @Override public boolean onOptionsItemSelected(MenuItem item) {//Menuボタンを押して出たメニューが選ばれたときの動作を記述 super.onOptionsItemSelected(item); switch(item.getItemId()){ //それぞれのitemの表示はres/menu/*.xmlで行う case R.id.menu_finishing : //強制的にActivityを終了する finish(); return true; } return false; } public void onActivityIntentButtonClick(View v){ //明示的インテントでextra部分に文字列を格納して送信 Intent intent = new Intent(getApplicationContext(),IntentRecieveTest.class); //Extraとして入力された文字列をsend_stringというキーを付けて保存 SpannableStringBuilder sb = (SpannableStringBuilder)text_input.getText(); intent.putExtra("send_string", sb.toString()); startActivity(intent); } public void onTelIntentButtonClick(View v){ //暗黙的インテントで電話機能を呼び出す Intent intent = new Intent(); intent.setAction(Intent.ACTION_VIEW); SpannableStringBuilder sb = (SpannableStringBuilder)tel_input.getText(); String tel_uri_str = "tel:"+sb.toString(); intent.setData(Uri.parse(tel_uri_str)); startActivity(intent); } }
明示的インテントを受信するActivityは,以下のように文字列を受けとる動作をIntentオブジェクトのgetStringExtra()メソッドで行っています.
package jp.ac.bunkyo.a2dgames; import android.os.Bundle; import android.app.Activity; import android.content.Intent; import android.view.Menu; import android.view.MenuItem; import android.widget.EditText; import android.widget.TextView; public class IntentRecieveTest extends Activity { TextView text_view; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_intent_recieve_test); text_view = (TextView)findViewById(R.id.intet_recieve_text); Intent intent =getIntent(); String sent_string = intent.getStringExtra("send_string"); text_view.setText(sent_string); } @Override public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.intent_recieve_test, menu); return true; } @Override public boolean onOptionsItemSelected(MenuItem item) {//Menuボタンを押して出たメニューが選ばれたときの動作を記述 super.onOptionsItemSelected(item); switch(item.getItemId()){ //それぞれのitemの表示はres/menu/*.xmlで行う case R.id.menu_finishing : //強制的にActivityを終了する finish(); return true; } return false; } }