Intentを使って画面を遷移する(明示的Intent)
|Intentはアプリケーション間の連携機能で異なるアプリケーションを繋ぐランタイム(機能・モジュール)です。付加情報(配列や、文字列、整数型など)を別アプリケーションに通知でき、他のActivityの呼び出し方法としてよく使われます。Activityをクラス名で指定して呼び出す方法を明示的Intent、動作(振る舞い)で呼び出し、Activityは指定しない方法を暗黙的Intentと呼びます。
暗黙的Intentは、所定の動作(たとえばメールを書く)のみ指定します。どんなActivityでも指定された動作が出来るなら、呼び出し対象となります。Android端末内には、Gmail や Word 、Notepadなどいろいろなアプリケーションがインストールできます。開発者でどのアプリを起動すればいいか、決めうちにするのは難しいですが、暗黙的Intentを使えば、利用者が好きなアプリケーションを選べます。
Intentは同一アプリケーション内でも利用可能です。
明示的に使う場合は主に画面遷移で使い、startActivityメソッドの引数として追加します。
今回は同一アプリケーション内での利用(明示的Intent)について解説します。
Intentを使ってStringを送信・受信するサンプルを用意しました。
使うアクティビティは次の通りです。
- intentActivity:メイン画面。”Send Intent”ボタンを押下するとIntentを送る
- subActivity:メイン画面からIntentを受け取る。サブ画面。
左がintentActivity、右がsubActivityのスクリーンキャプチャです。
今回のサンプルでは、intentActivityからsubActivityにIntentを送ります。
subActivity側で受け取ったIntentの内容を表示しています。
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" android:label="@string/sub_name"></activity> </application>
subActivityは後から作ることになります。Activityは、すべてAndroidManifestに登録する必要があります。この追加作業は忘れがちなので先にやっておくといいでしょう(はまりました)。
明示的Intentの送り方
intentActivityではボタンのOnClickListenerでintentを使っています
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); } }
ボタンリスナのonClickメソッド内でIntentの処理をしています。
intent.setClassName(packageName, className)はパッケージ名およびクラス名(パッケージ名を含む、クラスの完全な名前)を指定して下さい。”subActivity”のみだと、うまくIntentを生成することが出来ません。
今回は「!TEST STRING!」文字列を送ってみます。
17行目:putExtraメソッドは万能で、BundleやBoolean、CharSequence、Short、Parcelalbe、int、doubleなど、たくさんの型に対応しています。
受信時は、putStringExtra(name)などput~Extra(name)で受け取ることが出来ます。
19行目:startActivityメソッドでsetCallNameで設定したクラスへ、intentを送ります。
明示的Intentの受け取り方
つづいて、Intentを受け取るsubActivityです。
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はthis.getIntent()メソッドで受け取ります。ただし、IntentによらないでsubActivityが起動した場合、nullとなります。受け取り処理はnullチェックを入れるなど、値に注意して下さい。
String str = intent.getStringExtra("org.jpn.techbooster.demo.intent.testString"); Toast.makeText(this, str, Toast.LENGTH_LONG).show();
getStringExtraメソッドで文字列を取得して、トーストで表示します。
受け取る情報が1つで無い場合も、同様に、put~Extra / get~Extraメソッドを利用できます。
第1引数のnameは、項目ごと違う名前を用意して下さい。重複すると動きが不定になります。