Beginning Android 2D Video Games

Android上で2Dゲーム作成を始めてみたい方へ

参照: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を利用したデータの受け渡しと画面遷移は,以下の図に示すような動作を行うサンプルにて示します.

f:id:hidenaoA:20131018002942p:plain

まず,インテントを実行して別の画面を呼び出す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;
    }


}