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でした。