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

カタログ
  1. 1. AndroidManifest.xml の編集
  2. 2. 明示的 Intent
  3. 3. 起動先アクティビティにデータを送る
    1. 3.1. データを送る側のアクティビティ
    2. 3.2. データを受け取る側のアクティビティ

 

AndroidManifest.xml の編集

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

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

1
2
3
4
5
6
<application ~略~>
~略~

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

</application>

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

明示的 Intent

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
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を持たせる。

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
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);
}
}

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
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が起動して、『バリュー』と表示される

関連があるかもしれない記事