【Android】遷移先への値の受け渡し方と遷移元への値の返却方法

JUnitについての書籍が遂に発売します!
Java開発時のユニットテストを加速する「JUnit速効レシピ」


Androidアプリ開発では、沢山のActivityが登場し、
画面遷移もある程度の規模になると複雑化します。
そして、一つのActivity内だけで簡潔できる範疇を超えてくると、
Activity間での値の受け渡しが必須となります。
今回は、そんなActivity間の値の受け渡し方法として、
遷移元から遷移先へ値を渡す方法と、遷移先での値の受け取り方。
遷移先から遷移元へ値を返却する方法をサンプルコード付きで解説します。

  1. 遷移先への値の渡し方と受け取り方
  2. 遷移元への値の渡し方と受け取り方


遷移先への値の渡し方と受け取り方



Intentによる画面遷移では、遷移先のActivityを指定してIntentを作成し、
『startActivity()』メソッドにてActivityを開始します。

その際、Activityを開始させる前にIntentへ値を保持させる事で、遷移先へ値を渡す事が可能です。
遷移先では、渡されてきた値を受け取るというよりも、起動に利用されたIntentの中にある値を取得するイメージです。

Intentを値の一時保管場所として、値を保持出来れば遷移先からもIntent内の値を取得する事が出来るといった考え方です。


Intentへ値を保持させるには『putExtra()』メソッドを使用しましょう。



// 遷移先のactivityを指定してintentを作成
Intent intent = new Intent( this, MyActivity.class );

// intentへ添え字付で値を保持させる
intent.putExtra( "name", "hamada" );

// 指定のActivityを開始する
startActivity( intent );



MyActivityへ遷移させる為にIntentを作成し、intentクラスの『putExtra()』メソッドを起動します。
『putExtra()』メソッドの第一引数には、識別する為のキーを指定し、第二引数に渡したい値を指定します。
第一引数のキーは文字列である必要がありますが、第二引数は型の制限はありません。
ただ、型については値を取得する時に考慮する必要があります。

まずは上記の例の場合、MyActivityでの値の取り方を下記に示します。


// 現在のintentを取得する
Intent intent = getIntent();

// intentから指定キーの文字列を取得する
String name = intent.getStringExtra( "name" );



遷移先では、『getIntent();』メソッドにて現在のintentを取得できますので、
取得した現在のintentに対し、『getStringExtra();』メソッドにて引数に指定したキーに対する文字列を取得します。
ここで型の考慮が必要になります。
今回の例ですと、保管されている値は『hamada』という文字列ですので、『getStringExtra();』メソッドを使用しました。
同様に、数値の場合や、真偽値の場合では取得に用いるメソッドが異なります。
値の型毎に用意されている取得メソッドは下記の一覧の通りです。



真偽値の配列(boolean[])getBooleanArrayExtra( "キー" )
真偽値(boolean)getBooleanExtra( "キー" , デフォルト値 )
バンドル(Bundle)getBundleExtra( "キー" )
バイト配列(byte[])getByteArrayExtra( "キー" )
バイト(byte)getByteExtra( "キー" , デフォルト値 )
文字配列(char[])getCharArrayExtra( "キー" )
文字(char)getCharExtra( "キー" , デフォルト値 )
文字シーケンス配列(CharSequence[])getCharSequenceArrayExtra( "キー" )
文字シーケンスの配列(ArrayList)getCharSequenceArrayListExtra( "キー" )
文字シーケンス(CharSequence)getCharSequenceExtra( "キー" )
浮動小数点数配列(double[])getDoubleArrayExtra( "キー" )
浮動小数点数(double)getDoubleExtra( "キー" , デフォルト値 )
浮動小数点数配列(float[])getFloatArrayExtra( "キー" )
浮動小数点数(float)getFloatExtra( "キー" , デフォルト値 )
整数配列(int[])getIntArrayExtra( "キー" )
整数(int)getIntExtra( "キー" , デフォルト値 )
整数オブジェクトの配列(ArrayList)getIntegerArrayListExtra( "キー" )
整数配列(long[])getLongArrayExtra( "キー" )
整数(long)getLongExtra( "キー" , デフォルト値 )
オブジェクトの一時的保管領域配列(Parcelable[])getParcelableArrayExtra( "キー" )
オブジェクトの一時的保管領域配列( ArrayList)getParcelableArrayListExtra( "キー" )
オブジェクトの一時的保管領域( T)getParcelableExtra( "キー" )
シリアライズ(Serializable)getSerializableExtra( "キー" )
整数配列(short[])getShortArrayExtra( "キー" )
整数(short)getShortExtra( "キー" , デフォルト値 )
文字列配列(String[])getStringArrayExtra( "キー" )
文字列配列(ArrayList)getStringArrayListExtra( "キー" )
文字列(String)getStringExtra( "キー" )




全て添え字指定にて値を識別し、取得しますが
該当する添え字が無い場合、基本的にはnullが返却されます。
上記一覧内のメソッドの中には、第二引数にデフォルト値を指定出来るものがあり、
そのようなメソッドでは、キーに該当するものが無い場合はデフォルト値が返却されます。
もちろん、第二引数に指定するデフォルト値も、メソッドに該当する型である必要があります。








遷移元への値の渡し方と受け取り方




遷移先のActivityが『finish()』にて終了する際に、遷移元へ値を渡すには
遷移させる方法から意識する必要があります。

通常では、遷移先のActivityを元にIntentを作成し、
『startActivity()』メソッドにてActivityを開始しますが、
返却値を意識したActivityの起動時には、『startActivity()』の代わりに『startActivityForResult()』を使用します。




// 遷移先のactivityを指定してintentを作成
Intent intent = new Intent( this, MyActivity.class );

// 遷移先から返却されてくる際の識別コード
int requestCode = 1001;

// 返却値を考慮したActivityの起動を行う
startActivityForResult( intent, requestCode );




通常のActivity起動方法との違いは、起動時に『startActivityForResult()』を用いる事です。
『startActivityForResult()』の第一引数にはintentを指定し、
第二引数には、どの遷移先からの返却値なのかを判断する為の識別コードを
独自に指定します。


次に、返却値を受け取るメソッドを実装しましょう。
返却値を受け取るには、『onActivityResult()』を実装します。





public void onActivityResult( int requestCode, int resultCode, Intent intent )
{
 // startActivityForResult()の際に指定した識別コードとの比較
 if( requestCode == 1001 ){

  // 返却結果ステータスとの比較
  if( resultCode == Activity.RESULT_OK ){

   // 返却されてきたintentから値を取り出す
   String str = intent.getStringExtra( "key" );
  }
 }
}



第一引数からは『startActivityForResult()』の第二引数で指定した識別コードが取得でき、
第二引数からは後述の遷移先から渡される結果ステータスを取得出来ます。
第三引数は、値を格納する為のintentで、遷移先へ渡すのと同じように『putExtra()』にて格納されていますので、
該当する値の型を考慮したメソッドにて、キーを元に取得します。

それらの情報を元に、まずはどのリクエストに対するレスポンスなのかを判断し、
結果が成功か否か等のステータスを判断した後に、
渡されて来た値を使って処理をするというのが一般的です。



続いて、『finish();』する側、値を送り返す遷移先側の実装を見てみましょう。


// intentの作成
Intent intent = new Intent();

// intentへ添え字付で値を保持させる
intent.putExtra( "key", "result_val" );

// 返却したい結果ステータスをセットする
setResult( Activity.RESULT_OK, intent );

// アクティビティを終了させる
finish();





値の格納方法は、遷移先へ値を渡す方法と同じ様に、intentを作成して
『putExtra()』にて値を保持させます。

そして、結果セットとして返却する(onActivityResultへ送り返す)値を
『setResult()』にて指定します。

第一引数には結果ステータスを。第二引数には引き渡したい値を保持したintentです。

後は、特にスタートさせるActivityも無いので、そのまま『finish()』して下さい。

Activityを『finish()』させる事で、呼び出し元の『onActivityResult()』メソッドが起動されます。







これで、遷移先へ値を渡す事が出来、渡されて来た値を受け取る事も出来る。
遷移先から遷移元へコールバックの様な形で値を返却する事が出来る用になりました。

Androidアプリ開発では、複数のActivityを介して
様々な値をやり取りしますので、基本的な値の引渡し方法として念頭に置いて頂ければ幸いです。

実際、値の引渡しには専用の共通クラスを用意したり、サービスを利用するなど
intentを利用した方法以外にも存在します。

そういった別の扱い方は、別の機会に解説したいと思います。
まずは基本中の基本となるintentの扱いを身に着けて頂ければ幸いです。




JUnitについての書籍が遂に発売します!
Java開発時のユニットテストを加速する「JUnit速効レシピ」

コメントをお待ちしています

人気の投稿

Category

Algorithm (2) Android (8) ASP/aspx (1) Blogger (2) C/C++ (1) Chrome (5) CSS (9) Firefox (4) Fortran (1) Google (9) GoogleMap (2) HTML (12) IE (3) Information (4) iOS (2) iPhone/iPad/iPod (2) Java (6) JavaScript (16) jQuery (9) JSP (1) LifeRecipe (5) Linux (2) Macintosh (2) MapKit (4) Marketing (7) MySQL (3) NAMAZU (2) Objective-C (7) Other (7) Perl (1) PHP (9) Python (1) RSS/Atom (2) Ruby (1) Safari (2) SEO (11) Smarty (2) SQL (2) Tex (1) Three.js (1) Twitter (1) TwitterLog (313) UIKit (5) Unix (1) VBA/VBS (1) Windows (5) WordPress (3) Writing (5) XAMPP (1) XML (1) Yahoo (2) ZendFramework2 (14)

Archives