X

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は、項目ごと違う名前を用意して下さい。重複すると動きが不定になります。

mhidaka: Software Engineerだよ。DroidKaigi Organizer / Androidと組込とRe:VIEW。techbooster主宰。mhidaka's writings http://booklog.jp/users/mhidaka 技術書典! http://techbookfest.org
Related Post