[Android] 明示的IntentによるActivityの起動・データの送信

 

AndroidManifest.xml の編集

マニフェストファイルにActivityを追加する。

マニフェストで宣言されていないActivityは起動できない。

<application ~略~>
  ~略~

  <activity android:name=".AnotherActivity"></activity>

</application>

こんな感じで application要素 の中に activity要素を入れて、android:name属性に追加するアクティビティを書き込む。

明示的 Intent

起動したいアクティビティを明示的に指定して起動させる。

package jp.fernweh;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;

public class ExplicitIntentTest extends Activity {

  @Override
  public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    Intent intent = new Intent();

    // Intent#setClassNameメソッドで
    // 起動するActivityを指定する
    String packageName = "jp.fernweh";
    String className = "jp.fernweh.AnotherActivity";
    intent.setClassName(packageName, className);

    // startActivity() で起動する
    // このメソッドで起動したActivityからデータは受け取れない
    startActivity(intent);
  }
}

いきなりAnotherActivityを呼び出すだけのあまり意味が無いコード。

起動先アクティビティにデータを送る

データの入れ物となるBundleにデータを持たせる。

で、IntentにBundleを持たせる。

データを送る側のアクティビティ

package jp.fernweh;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.LinearLayout;
import android.widget.TextView;

public class ExplicitIntentTest2 extends Activity implements OnClickListener{

  public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    LinearLayout layout = new LinearLayout(this);
    TextView text = new TextView(this);
    Button btn = new Button(this);
    btn.setText("押すとIntentを送るよ");
    btn.setOnClickListener(this);
    layout.addView(text);
    layout.addView(btn);
    setContentView(layout);
  }

  @Override
  public void onClick(View v) {
    // 前のコードと起動アクティビティの
    // 設定の方法が違うけども
    // 同じパッケージのアクティビティを
    // 起動する場合はコレでオッケー
    Intent intent = new Intent(this, AnotherActivity.class);

    // データを作成して Intent に渡す
    // 1\. データの入れ物となるBundleインスタンスを作って
    // 2\. Bundle#putString( key, value ) でキーと値を入れる
    // 3\. Intent#putExtras( bundle ) でIntentに渡す
    Bundle bandle = new Bundle();
    bandle.putString("foobar", "バリュー");
    intent.putExtras(bandle);
    // 上の3行は
    // intent.putExtra("foobar", "バリュー");
    // の一行と等価。
    // purExtra の第二引数は基本データ型、
    // その配列や一部のクラスを受け付ける。

    startActivity(intent);
  }
}

データを受け取る側のアクティビティ

package jp.fernweh;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.widget.TextView;

public class AnotherActivity extends Activity {
  /** Called when the activity is first created. */
  @Override
  public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    TextView text = new TextView(this);
    setContentView(text);

    // 送られてきたIntentから起動パラメータを取り出す
    // 送られたIntentを取得
    Intent intent = getIntent();
    // IntentからBundleを取り出す
    Bundle bundle = intent.getExtras();
    if (bundle != null) {
      // Bundleからデータを取り出す
      String string = bundle.getString("foobar");
      // getIntent().getString(key) と
      // intent.getStringExtra(key) は等価。
      // 取得するデータが少ないなら Bundle を
      // 取り出すのはメンドウ。

      text.setText(string);
    }
  }
}

これでExplicitIntentTest2を動かせばAnotherActivityが起動して、『バリュー』と表示される

Share
関連記事