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