起動される側のEditor Activityのソースコードです。
1 package com.example.android.dual;
2
3 import android.app.Activity;
4 import android.content.Intent;
5 import android.os.Bundle;
6 import android.view.View;
7 import android.widget.Button;
8 import android.widget.EditText;
9
10 public class Editor extends Activity {
11
12 @Override
13 public void onCreate(Bundle savedInstanceState) {
14 super.onCreate(savedInstanceState);
15 setContentView(R.layout.editor);
16
17 Button button = (Button)findViewById(R.id.Button01);
18
19 Bundle extras = getIntent().getExtras();
20 if (extras != null) {
21 EditText editText = (EditText)findViewById(R.id.EditText01);
22 editText.setText(extras.getCharSequence("TEXT"));
23 }
24
25 button.setOnClickListener(new View.OnClickListener() {
26
27 @Override
28 public void onClick(View v) {
29 Intent intent = new Intent();
30 EditText editText = (EditText)findViewById(R.id.EditText01);
31 CharSequence text = editText.getText();
32 intent.putExtra("TEXT", text);
33 setResult(RESULT_OK, intent);
34 finish();
35 }
36
37 });
38 }
39 }
13行目からonCreate()を実装しています。起動される側の特徴としては、19行目にあるgetIntent()で渡されたIntentを取得し、IntentからgetExtras()ですべての追加情報をBundleとして取り出しています。Bundleがnullではなかったら、EditTextに受け取った追加情報を設定しています。
ボタンが押されたときの処理もクローズアップして詳しく見てみましょう。
27 @Override
28 public void onClick(View v) {
//付加情報を返すためにIntentを作成
29 Intent intent = new Intent();
30 EditText editText = (EditText)findViewById(R.id.EditText01);
31 CharSequence text = editText.getText();
//Intentに付加情報を付与
32 intent.putExtra("TEXT", text);
//結果コードと付加情報を持つIntentでsetResult()を呼び出す
33 setResult(RESULT_OK, intent);
//finish()でActivityを終了
34 finish();
35 }
29行目でIntentを作成しています。今回は戻り先が決まっているので、デフォルトコンストラクタを使用しています。
33行目で結果コードと付加情報を持つIntentを呼び出し元に返しています。
34行目のfinish()は、現在のActivityを終了させるために呼び出します。これは前回のActivityのライフサイクルで触れたメソッドですね。
2つのActivityを使うには、Application Nodesに設定する必要があります。AndroidManifest.xmlをEclipse上でダブルクリックすると、ADTの機能の1つ「Android Manifest Editor」で内容を編集できます。[Application]タブを選択して、[Application Nodes]に2つ目のActivityを追加します。
Activityの名前の先頭に「.」が付いています。このドットはカレントパッケージを表していて、あってもなくても構いません。
なお、今回のアプリはパッケージが「com.example.android.dual」で、Activityはcom.example.android.dual.Mainクラスなので、指定はMainでも.Mainでも構いません。しかし、Activityがcom.example.android.dual.foo.Mainなら、指定は「com.example.android.dual.foo.Main」か「.foo.Main」でなければならず、「foo.Main」ではエラーになります(サブパッケージ指定ではなくfooパッケージのMainを指定していることになるため)。
Dual Activityを動作させてみて、コードを併せ読むことで、画面遷移と情報の受け渡しの方法が理解できたのではないかと思います。次に、Intentの異なる使い方を見てみます。
以下のアプリをダウンロードしてEclipseにインポートしてください。
画面はこんな感じです。
このアプリは入力したUriと選択したアクションで、起動するActivityをシステムに判断させます。
30 @Override
31 public void onClick(View v) {
32 try {
33 EditText editText = (EditText)findViewById(R.id.EditText01);
34 Spinner spinner = (Spinner)findViewById(R.id.Spinner01);
35 Intent intent = new Intent(spinner.getSelectedItem().toString(),Uri.parse(editText.getText().toString()));
36 startActivity(intent);
37 } catch (Exception e) {
38 TextView textView = new TextView(Main.this);
39 textView.setText(e.getMessage());
40 Dialog dialog = new Dialog(Main.this);
41 dialog.setTitle(e.getClass().getName());
42 dialog.setContentView(textView);
43 dialog.show();
44 }
45 }
大事なのは35行目と36行目です。
35行目で、EditTextに入力されたUri(URIを表すクラス)とSpinner(コンボボックスのクラス)で選択されたアクションをIntentに設定しています。Uriとアクションの所定の組み合わせでIntentを作成すると、そのIntentを使用してあらかじめAndroidが持っているActivityを起動できます。
組み合わせと起動するActivityは、以下の表3のとおりです。
Uri | アクション | Activityと説明 |
---|---|---|
・http://web_address ・https://web_address |
android.intent.action.VIEW | Webブラウザを起動 |
・空白文字 ・http://web_address ・https://web_address |
android.intent.action.WEB_SEARCH | Webブラウザでデバイスの場所のファイルを開く(※) |
・tel:phone_number | android.intent.action.CALL | 電話を発信 |
・tel:phone_number ・voicemail: |
android.intent.action.DIAL | 電話番号入力画面を起動 |
・geo:latitude,longitude ・geo:latitude,longitude?z=zoom ・geo:0,0?q=my+streeet+address ・geo:0,0?q=business+near+city |
android.intent.action.VIEW | 地図アプリケーションを起動 |
・google.streetview:cbll=lat,lng &cbp=1,yaw,,pitch,zoom &mz=mapZoom |
android.intent.action.VIEW | ストリートビューを起動 |
表3 Uriとアクションの組み合わせと起動するActivity |
地図アプリケーションは地名や住所で検索してくれるので手入力も可能ですが、緯度や軽度、ヨーやピッチは手入力するのはかなり至難の業です。
自分のアプリと地図アプリやストリートビューとの連動は、Intentに設定するUriの作成がキモになります。興味のある読者が多いようなら、この辺りを丁寧に説明しようかなと思います。
さてIntentについては、これでほぼ半分ぐらい説明したかな、という感じです。次回は画面の構成(レイアウトやウィジェット)について説明する予定です。
Copyright © ITmedia, Inc. All Rights Reserved.