Intentで画面遷移する(明示的Intent)/Getting started


Intentは、複数のアプリケーションやActivityを繋ぐ、架け橋のようなものです。
※ここでは、アプリケーションはGmailやブラウザ等のアプリの事を指し、ActivityはJavaクラスの事を指します。

Intentを用いることで配列や文字列、整数型などを別アプリケーションに通知でき、他のActivityの呼び出し方法としてよく使われます。

明示的Intentと暗黙的Intent

IntentでActivityを呼び出す方法には以下の2つがあります。

  • Activityをクラス名で指定して呼び出す方法=明示的Intent
  • 動作(振る舞い)で呼び出し、Activityを指定しない方法=暗黙的Intent

明示的Intent

Intentは同一アプリケーション内でも利用可能です。
Intentを明示的に使う場合は主に画面遷移で使い、IntentクラスのstartActivityメソッドの引数として追加されます。
今回は同一アプリケーション内での利用(明示的Intent)について解説します。

サンプルプログラム

今回は、Intentを使ってString(文字列)を送信・受信するサンプルを用意しました。

使うアクティビティは次の通りです。

  • IntentActivity:メイン画面。”Send Intent”ボタンを押下するとIntentを送る
  • SubActivity:メイン画面からIntentを受け取る。サブ画面。

 
左がIntentActivity、右がSubActivityのスクリーンキャプチャです。
今回のサンプルでは、IntentActivityからSubActivityにIntentを送ります。

SubActivityは、受け取ったIntentの内容をトーストで表示しています。

それではまず、各ActivityをManifestへ登録しましょう。
AndroidManifest.xmlに、次のソースコードの9行目を追記します。

■AndroidManifest.xml

<application android:icon="@drawable/icon" android:label="@string/app_name">
    <activity android:name=".IntentActivity" android:label="@string/app_name">

        <intent-filter>
            <action android:name="android.intent.action.MAIN" />
            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>
    <activity android:name=".SubActivity"></activity>
</application>

Activityは、全てAndroidManifestに登録する必要があります。
この追加作業は忘れがちなので先にやっておくといいでしょう(はまりました)。

明示的Intentの送り方

IntentActivityではボタンのOnClickListenerでintentを使っています

ボタンの使い方については、ボタンの使い方 / Getting Startedを御覧ください。

■src/IntentActivity.java

public class IntentActivity extends Activity implements OnClickListener{
    /** 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);
    }

    //インターフェイスを実装 implements OnClickListener
    public void onClick(View v) {
    	Intent intent=new Intent();
    	intent.setClassName("org.jpn.techbooster.demo.intent","org.jpn.techbooster.demo.intent.SubActivity");
    	intent.putExtra("org.jpn.techbooster.demo.intent.testString", "!TEST STRING!");

    	startActivity(intent);
	}
}

14~20行目で、ボタンリスナのonClickメソッド内でIntentの処理をしています。
IntentクラスのsetClassNameメソッドは、パッケージ名およびクラス名(パッケージ名を含むクラスの完全な名前)を指定して下さい。”SubActivity”のみだと、うまくIntentを生成することが出来ません。

今回は「!TEST STRING!」文字列を送ってみます。
17行目:putExtraメソッドは万能で、BundleやBoolean、CharSequence、Short、Parcelalbe、int、doubleなど、たくさんの型に対応しています。
受信時は、getStringExtra(name)などget~Extra(name)で受け取ることが出来ます。
受け渡しができる情報の種類は非常に多いです。
詳しくはリファレンスを御覧ください。

19行目:startActivityメソッドでsetCallNameで設定したクラスへ、intentを送ります。

明示的Intentの受け取り方

つづいて、Intentを受け取るSubActivityです。

■src/SubActivity.java

public class SubActivity extends Activity {
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.sub);

        Intent intent = getIntent();
        if(intent != null){
        	String str = intent.getStringExtra("org.jpn.techbooster.demo.intent.testString");
        	Toast.makeText(this, str, Toast.LENGTH_LONG).show();
        }
    }
}

IntentはgetIntent()メソッドで受け取ります。
もしIntentによらないでSubActivityが起動した場合、nullとなります。
今回のサンプルプログラムの場合、IntentActivityに設置されている「send Intent」ボタンが押されずにSubActivityが起動したら、Intentの中身はnullとなります。

受け取り処理はnullチェックを入れるなど、値に注意して下さい。
今回は9行目で、Intentの中身がnullかどうかを判定しています。

10行目:IntentクラスのgetStringExtraメソッドで文字列を取得して、11行目でトーストで表示します。
受け取る情報が複数の場合も同様に、put~Extra / get~Extraメソッドを利用できます。

※注:ArrayListを受け渡す時のみ、「putExtra」ではなく「put◯◯ArrayListExtra」を用いる

今回のサンプルプログラムでは、putExtraメソッドを用いて、String(文字列)をIntentActivityからSubActivityへ受け渡しました。
もし受け渡したい情報がArrayListの場合は、「putExtra」ではなく「put◯◯ArrayListExtra」を用いなければなりません。(例:putIntegerArrayListExtra)

putIntegerArrayListExtraメソッドを使ってみる

では、実際にputIntegerArrayListExtraメソッドを使ってArrayListの受け渡しを行ってみましょう。
先ほど作成したサンプルプログラムのIntentActivityに変更を加え、現在の年月日をSubActivityにArrayListとして受け渡すよう変更します。

■src/IntentActivity.java

public class IntentActivity extends Activity implements OnClickListener{
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        //省略
    }

    //インターフェイスを実装 implements OnClickListener
    public void onClick(View v) {
	ArrayList<Integer> date = new ArrayList<Integer>();
	Calendar calendar = Calendar.getInstance();
	date.add(calendar.get(Calendar.YEAR));
	date.add(calendar.get(Calendar.MONTH) + 1);
	date.add(calendar.get(Calendar.DAY_OF_MONTH));

    	Intent intent=new Intent();
    	intent.setClassName("org.jpn.techbooster.demo.intent","org.jpn.techbooster.demo.intent.SubActivity");
    	intent.putIntegerArrayListExtra("org.jpn.techbooster.demo.intent.testString",date);

    	startActivity(intent);
	}
}

10~14行目で、現在の年月日をArrayListヘ格納しています。
18行目で、putExtraの代わりにputIntegerArrayListExtraメソッドを用いてArrayListを受渡しています。

受け渡される情報の型が変わったので、受け取る側もその型に対応しなければなりません。
先ほど作成した、SubActivityも変更します。

■src/SubActivity.java

public class SubActivity extends Activity {
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.sub);

        Intent intent = getIntent();
        if(intent != null){
		ArrayList<Integer> str = intent
				.getIntegerArrayListExtra("org.jpn.techbooster.demo.intent.testString");
		Toast.makeText(
				this,
				Integer.toString(str.get(0)) + "年"
						+ Integer.toString(str.get(1)) + "月"
						+ Integer.toString(str.get(2)) + "日",
				Toast.LENGTH_LONG).show();
       }
    }
}

10~11行目でgetIntegerArrayListExtraメソッドを用いてArrayListを受け取り、14~16行目で文字列として出力できる形にしています。

今回用いた、重要なメソッドを表にまとめました。

メソッド名説明
setClassNameメソッドIntentを受け渡す先のActivityを指定します。
putExtraメソッドIntentで受け渡す情報をセットします。
put◯◯ArrayListExtraメソッドArrayListをIntentでの受け渡しにセットします。
◯◯には、受け渡すArrayListの中身の型を入力します。
startActivityメソッドIntentを受け渡す作業を開始します。
getIntentメソッドIntentを受け取ります。
get◯◯Extraメソッド受け取ったIntentから渡される情報を引き出します。
◯◯には、引き出された情報の型を入力します。
get◯◯ArrayListExtraメソッド受け取ったIntentから渡されるArrayListを引き出します。
〇〇には、引き出したArrayListの中身の型を入力します。

以上、Intentで画面遷移する(明示的Intent)/Getting startedでした。

2 Comments