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

1
2
3
4
5
6
7
8
9
10
<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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
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