連載
» 2009年02月05日 00時00分 公開

ブラウザや地図、ストリートビューの基、Intentとは?Androidで動く携帯Javaアプリ作成入門(3)(3/3 ページ)

[緒方聡,株式会社イーフロー]
前のページへ 1|2|3       

Editor Activityの実装

 起動される側の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のライフサイクルで触れたメソッドですね。

「Android Manifest Editor」でApplication NodesにActivityを追加

 2つのActivityを使うには、Application Nodesに設定する必要があります。AndroidManifest.xmlをEclipse上でダブルクリックすると、ADTの機能の1つ「Android Manifest Editor」で内容を編集できます。[Application]タブを選択して、[Application Nodes]に2つ目のActivityを追加します。

図6 ほかのActivityを実行した際の状態遷移 図6 Application Nodesに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を指定していることになるため)。

Intentを使ってWebブラウザや地図、ストリートビュー

 Dual Activityを動作させてみて、コードを併せ読むことで、画面遷移と情報の受け渡しの方法が理解できたのではないかと思います。次に、Intentの異なる使い方を見てみます。

 以下のアプリをダウンロードしてEclipseにインポートしてください。

編集部注:最新の環境では、サンプルコードをEclipseにインポートすると、コンパイルエラーが発生することがあります。対処法は連載第2回の『2011年9月23日追記「Androidのバージョン違いによるサンプルの動作について補足」』をご参照ください

 画面はこんな感じです。

図7 Activityを再開した際の状態遷移 図7 Intent Casterの画面イメージ

 このアプリは入力したUriと選択したアクションで、起動するActivityをシステムに判断させます。

Intent CasterのMain.javaのソースコードを一部抜粋 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
※記事公開時点(2009年2月5日)の最新環境「Android SDK 1.0 Release 2」では、WEB_SEARCHは正常に機能しない。レポートされているので、いずれ改修されるであろう

 地図アプリケーションは地名や住所で検索してくれるので手入力も可能ですが、緯度や軽度、ヨーやピッチは手入力するのはかなり至難の業です。

 自分のアプリと地図アプリやストリートビューとの連動は、Intentに設定するUriの作成がキモになります。興味のある読者が多いようなら、この辺りを丁寧に説明しようかなと思います。

次回は、レイアウトやウィジェットについて

 さてIntentについては、これでほぼ半分ぐらい説明したかな、という感じです。次回は画面の構成(レイアウトやウィジェット)について説明する予定です。


「Androidで動く携帯Javaアプリ作成入門」バックナンバー
前のページへ 1|2|3       

Copyright © ITmedia, Inc. All Rights Reserved.

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。