ユーザインターフェース

原文: http://developer.android.com/guide/topics/ui/index.html

                                                                                                              • -

Androidアプリケーションでは、View(ビュー)とViewGroup(ビューグループ)オブジェクトを利用してユーザインターフェースを作成します。ViewとViewGroupには数多くの種類が存在しますが、それは全てViewクラスの派生クラスとなります。

ViewオブジェクトはAndroidプラットフォーム上に表示されるユーザインターフェースの基本単位です。Viewクラスは、テキストフィールドやボタンのようなUIオブジェクトである”ウィジェット”と呼ばれるクラスの基底クラスです。一方、ViewGroupクラスは、線形、表形式、相対形式といった様々なレイアウトアーキテクチャを提供する”レイアウト”と呼ばれるクラスの基底クラスです。

Viewオブジェクトは、レイアウトのパラメータや、画面上の特定の四角形の領域の情報を保持することができ、その領域の大きさ、レイアウト、描画コンポーネント、フォーカスの変更、スクロール、キー/ジェスチャーなどを管理します。Viewはユーザインターフェース上のオブジェクトとして、ユーザとイベントを受け取るレシーバとの橋渡し役を担います。


【ページ内目次】

View構成

Androidプラットフォームでは、下記の図にあるように、ViewとViewGroupを利用してアクティビティのUIを定義します。この階層ツリーは必要に応じてシンプルな構成にも複雑な構成にもできます。Androidで標準提供されているウィジェットやレイアウトを使うこともできますし、自身で作成したオリジナルのViewを使ってツリーを組み立てることもできます。


ビュー階層を画面上に描画するために、ActivityはsetContentView()メソッドを呼び、View階層のルートノードのオブジェクトを渡さなければなりません。そのオブジェクトを受け取ったAndroidシステムは、無効化、計測、ツリーの描画といった処理を行います。一方、階層のルートノードは、その子ノードに子ノード自身を描画するよう要求します。同様に、各ビューグループは自分の子ビューを呼び出して描画処理を実行させます。子ビューは、親ビューに対して自分達が収まることができるサイズや位置であることを要求しますが、どの大きさにするかの最終的な判断は親ビューが行います。Androidはレイアウトの要素を(階層ツリーのトップから)順に解析し、Viewのオブジェクトを生成し、親オブジェクトに追加していきます。要素の位置が重複した場合は、最後に描画されたオブジェクトが以前に描画されたものの前面に表示されます。

ビュー階層の解析や描画方法の詳細は、「Androidがビューを描画する方法」を参照してください。

レイアウト

レイアウトを定義し、View階層を表現するもっとも一般的な方法は、XMLファイルを利用することです。XMLは、HTMLのように人が読んでわかりやすい構造になっています。XMLの各エレメントは、ViewかViewGroup(もしくはそれらの派生クラス)になります。Viewオブジェクトはツリーの葉の部分で、ViewGroupはツリーの枝の部分に位置します(上記のビュー階層の図を参照してください)。

XMLエレメントの名前は、エレメントが実行するJavaクラスを表しています。エレメントはUI上でTextViewのオブジェクトを生成しますし、エレメントはLinearLayoutというViewGroupを生成します。Androidがレイアウトリソースの読み込む際、レイアウトの各エレメントに対応する上記のようなランタイムオブジェクトを生成します。

具体例として、テキストビューとボタン付きのシンプルなレイアウトを以下に示します。


    
    


LinearLayoutエレメントがTextViewとButtonを含んでいることに注目してください。ここに別のLinearLayout(もしくは他のViewGroupでも可)をネストして、ビュー階層を長くし、より複雑なレイアウトを作成することもできます。

UIレイアウトの組み立てに関する詳細は、「レイアウトの宣言」を参照してください。

ビューを組み立てる方法は他にもたくさんあります。違うタイプのViewGroupを使えば、色んなやり方で子ViewやViewGroupを組み立てることができます。AndroidからはLinearLayout, RelativeLayout, AbsoluteLayout, TableLayout, GridLayoutといったViewGroupが標準で提供されています。それぞれが、異なるレイアウトパラメータを持っており、子Viewの位置やレイアウト構造を定義することができます。

レイアウトで使用するViewGroupの詳細は、「よく使うレイアウトオブジェクト」を参照してください。


JavaソースコードからViewやViewGroupを描画することもできます。addView(View)メソッドを読んで、新規のViewやViewGroupオブジェクトを直接インサートしてください。

ウィジェット

ウィジェットとは、ユーザとのインターフェースとなるViewオブジェクトです。Androidでは、ボタン、チェックボックス、テキスト入力フィールドなど、多数のウィジェットを標準で提供しており、UIを効率良く開発することができます。Androidから標準で提供されているウィジェットの中には、日付ピッカー、時計、ズームコントロールなど複雑なものもあります。しかしながら、Androidプラットフォームで提供されるウィジェットに縛られることはありません。自分でViewオブジェクトを作成し、既存のウィジェットと組み合わせることもできますし、自分だけのウィジェットを独自に作成することもできます。

詳細は「カスタムコンポーネントの開発」を参照してください。

Androidで提供されているウィジェットリストは、android.widgetパッケージを参照してください。

UIイベント

ビューやウィジェットをUIに追加した後は、ユーザが何らかの処理をしたことをどうやって受け取るのかについて知りたいと思うかもしれません。UIのイベントを受け取るには、以下の2つのうちどちらかを実行する必要があります。

  • イベントリスナーを定義し、Viewに登録する
    • たいていの場合は、この方法でイベントを受け取ります。Viewクラスは、On()でイベントが発生した際に呼ばれるOnListenerという名前のインターフェースを持っています。例えば、View.OnClickListener(Viewのクリックイベント処理)、View.OnTouchListener(View内のタッチスクリーンイベント処理)、View.OnKeyListener(View内の端末キー押下イベント処理)などです。もし、(ボタンが選択されたなどのように)クリックされたことをビューに通知したい場合には、OnClickListenerを実装し、onClick()のコールバックメソッドとしてsetOnClickListener()を利用してViewに登録します。
  • Viewにある既存のコールバックメソッドをオーバーライドする
    • 自分でViewクラスを実装し、そこで発生する特殊なイベントを受け取りたい場合に、この方法を使います。イベントの例として、スクリーンがタッチされたとき(onTouchEvent())、トラックボールが動かされたとき(onTrackballEvent())、端末キーが押されたとき(onKeyDown())などが挙げられます。この方法により、カスタムビューの中で各イベントに対するデフォルトの振る舞いを定義し、イベントを他の子ビューに渡すかどうかを決定することができます。もう一度言うと、コールバックメソッドはViewクラスにあるので、カスタムViewを開発したときにだけ、デフォルトの振る舞いを定義することができます。

ユーザとViewとの対話に関しては、「UIイベントのハンドリング」で続きを読むことができます。

メニュー

アプリケーションメニューは、アプリケーションUIにおいて、重要なパートの1つです。メニューでは、アプリケーションの機能や設定を公開するために、信頼あるインターフェースを提供します。最もよく目にするアプリケーションメニューは、端末のMENUキーを押した際に表示されるメニューだと思います。ただし、ユーザがある項目を押下した際に表示されるコンテキストメニューを独自に追加することもできます。

メニューもView階層を利用して構成されますが、メニュー自身がその構造を定義したりはしません。代わりに、アクティビティのonCreateOptionsMenu()やonCreateContextMenu()のコールバックメソッド内で、メニューに含めたい項目を宣言します。Androidは必要なときに自動的にメニューのView階層を作成し、その中に先ほどのメニュー項目を描画します。

メニューはイベントを処理することもできるため、メニュー項目にイベントリスナーを登録する必要はありません。メニュー項目が選択された際は、onOptionsItemSelected()かonContextItemSelected()がフレームワークから呼ばれます。

アプリケーションレイアウトと同様に、XMLファイルでメニュー項目を宣言することもできます。

詳細は「メニュー作成」を参照してください。

応用編

ユーザインターフェース作成の基礎が掴めたら、もっと複雑なアプリケーションインターフェースを作成できる高度な機能も見てみましょう。

アダプタ
ViewGroupにハードコードできないようなデータを埋め込みたい、つまり外部ソースのデータをビューにバインドしたい場合は多いはずです。その場合は、ViewGroupにAdapterView(アダプタビュー)を使用することで、生成された子Viewにアダプタのデータが埋め込まれます。

AdapterViewは、ViewGroupの実装クラスで、渡されたアダプタオブジェクトをもとに、描画する子Viewを決定します。アダプタはデータソース(外部文字列の配列など)とAdapterView間のキャリアのような振る舞いをします。アダプタには、例えばカーソルからデータベースのデータを読み込むCursorAdapterや、任意の配列からデータを読むArrayAdapterなど、各タスクごとに実装クラスが複数存在します。

アダプタの使用に関する詳細は、「AdapterViewへデータをバインドする」を参照してください。

スタイルとテーマ
恐らく標準で提供されているウィジェットの見た目に満足できない場合も出てくるはずです。Androidでは、独自のスタイルとテーマを作成して、標準のウィジェットを修正することができます。

  • スタイルとは、フォーマット用の属性群のことであり、レイアウト内の各エレメントに適用することができます。例えば、任意のテキストサイズやカラーをスタイルで指定し、特定のViewエレメントにだけ適用するといったことも可能です。
  • テーマもまた、フォーマット用の属性群のことであり、アプリケーション内の複数のアクティビティや、もしくは単一のアクティビティに対して適用することができます。例えば、テーマを利用して、ウィンドウフレームやパネルのバックグラウンドカラーを指定したり、メニューのテキストサイズやカラーを指定したりすることができます。テーマは特定のアクティビティに対してのみか、アプリケーション全体のどちらかに適用することが可能です。

スタイルとテーマはリソースの一種です。デフォルトのスタイルやテーマをそのまま使うこともできますし、独自のカスタムスタイルやテーマを宣言することもできます。

スタイルやテーマの使用に関する詳細は、「スタイルとテーマの適用」を参照してください。

                                                                                                                        • -


Android翻訳目次へ

Hello, Views

原文: http://developer.android.com/guide/tutorials/views/index.html

                                                                                                              • -

本章にある”Hello, World”スタイルのチュートリアルは、開発者がAndroidでよく利用されるViewやウィジェットを素早く開発できるように構成されています。以下のような退屈な処理はコピー&ペーストし、Androidアプリケーションの根幹となる部分を開発することに注力してほしかったのです。もちろん、提供するコードに関しては解説し、理解してもらうつもりでいます。

今回のチュートリアル、相当数の前提知識が必要です。まだ「Hello, World」チュートリアルが完了していないのであれば、まずはそちらをやってください。基本的なAndroidの開発とEclipseの機能に関して、知っておくべき多くの情報が盛り込まれています。特に知っておくべき事項として、以下が挙げられます。

  • 新規Androidプロジェクトの作成方法
  • Androidプロジェクトの基本的な構成(リソースファイル、レイアウトファイルなど)
  • アクティビティの必須要素
  • プロジェクトのビルド・実行方法

また、チュートリアルをシンプルにするために、Androidのコーディングプラクティスが全て盛り込まれている訳ではありません。特に、ほとんどのチュートリアルでレイアウトファイルに文字列をハードコードしています。strings.xmlファイルから文字列を参照するのが、より良いプラクティスであることを是非知っておいてください。

上記の内容を頭に入れつつ、チュートリアルを開始しましょう。好きなものを選択してください。

線形レイアウト相対レイアウトテーブルレイアウト
日付ピッカー時刻ピッカーフォームのいろいろ
スピナー*1オートコンプリートリストView
グリッドViewギャラリータブウィジェット
マップViewWeb View

利用可能なViewやウィジェットは他にもたくさんあります。Viewレイアウトに関しては、Viewクラスを参照してください。widgetパッケージにあるウィジェットも役に立ちます。コードサンプルに関しては、「Apiデモ」を参照してください。//samples/ApiDemosでオフラインから参照することもできます。

                                                                                                                        • -

Android翻訳目次へ

*1:セレクトボックスのことだと思います

Hello, World

Android1.0の記事から多少内容が変わっていました。大きく違うのは、strings.xmlファイルでAndroidに表示する文字列を定義するところかな。

原文:http://developer.android.com/guide/tutorials/hello-world.html

                                                                                                              • -

開発者が初めてAndroidで”Hello World!”を書いたとしたら、とても簡単だという印象を受けるはずです。実際、本当に簡単なのです。IDEEclipseを使えばさらに簡単です。プロジェクトの作成や管理を行う強力なプラグインを提供しているため、開発スピードが格段に速くなるはずです。

Eclipseを使っていない場合でも、大丈夫です。「その他のIDEでの開発」を読んだ後、この章に戻ってきてEclipseについてのすべての記述を無視すれば良いのです。

以降を始める前に、まずは最新のSDKがインストールしてください。もしEclipseを使用するなら、ADTプラグインもインストールしてください。インストール方法は「Android SDKのインストール」を参照してください。


以降に表示されているスクリーンショットを大きくしたい場合には、画像をクリックしてください。

プロジェクトを作成する

1. 新規Androidプロジェクトを開く

Eclipseメニューの ファイル > 新規 > プロジェクトを選択します。EclipseAndroidプラグインのインストールが成功していれば、結果ダイアログの”Android”フォルダを開くと”Androidプロジェクト”が含まれています。

Androidプロジェクト”を選択して、次へを押してください。


2. プロジェクト詳細を入力する

次の画面では、プロジェクトの詳細情報を入力します。

  • プロジェクト名: HelloAndroid
  • パッケージ名: com.example.hello (任意のネームスペースでも良い)
  • アクティビティ名: HelloAndroid
  • アプリケーション名: Hello, Android

完了をクリックしてください。


画面項目の説明です。

プロジェクト名 プロジェクトを格納するディレクトリやフォルダ名
パッケージ名 ソースコードを格納するパッケージのネームスペース(Java言語と同様のパッケージルールに従います)。設定したパッケージの下にアクティビティのスタブが生成されます。アプリケーションで使用するパッケージ名はシステムにインストールされた全パッケージを通してユニークでなければなりません。アプリケーションに対して標準的なドメイン形式のパッケージを設定することが非常に重要です。上記の例では、ドメイン”com.android”パッケージを使用していますが、あなたの組織に合ったもの使用してください。
アクティビティ名 プラグインによって生成されるスタブクラスの名前です。Androidのアクティビティクラスのサブクラスになります。アクティビティは、それ自体で実行して何らかの処理をする単純なクラスです。アクティビティはUIを作成することもできますが、必須ではありません。
アプリケーション名 ユーザに対して表示されるアプリケーション名です。

3. 自動生成されたソースコードを開く
プラグインがプロジェクトを作成すると、以下のようなHelloAndroidという名前のクラスが作成されます(クラスは入力したパッケージ内のHelloAndroid > src > com.android.helloにあります)。

package com.example.hello;

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

public class HelloAndroid extends Activity {
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
    }
}


では、ソースコードを修正しましょう。

UIを構築する
下記の修正されたコードを見て、同じようにHelloAndroid.javaファイルを変更してください。ソースコードに関しては、1行ずつ詳細に解説していきます。

package com.android.hello;

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

public class HelloAndroid extends Activity {
   /** Called when the activity is first created. */
   @Override
   public void onCreate(Bundle savedInstanceState) {
       super.onCreate(savedInstanceState);
       TextView tv = new TextView(this);
       tv.setText("Hello, Android");
       setContentView(tv);
   }
}


TextViewパッケージのインポートを忘れてしまった場合には、Ctrl-Shift-OMacの場合はCmd-Shift-O)を実行してみてください。このコマンドはimport部分を編成するEclipseのショートカットで、インポートせずにパッケージを宣言した場合に自動的に追加してくれます。

Activityクラスを継承した上記のソースコードを見てみましょう。アクティビティとは、アクションを実行するための唯一のアプリケーションエンティティです。アプリケーションはたくさんのアクティビティを保持しますが、ユーザとやりとりできるのは一度に1つだけです。実際には、アクティビティが必ずユーザインターフェースを持たなければならないという訳ではありませんが、持っている場合がほとんどです。

Androidでは、ユーザインターフェースはView(ビュー)と呼ばれるクラス階層で構成されています。Viewはラジオボタンやアニメーション、テキストラベルのようなシンプルな描画オブジェクトです。ここで使われているTextViewはテキストを扱う特殊なViewのことです。

TextViewを生成しているのが以下のコードです。

TextView tv = new TextView(this);


TextViewのコンストラクタ変数は、Android Contextのインスタンスです。Contextは単にシステムのハンドルであり、リソースの解決や、データベースや設定情報へのアクセスの取得などのサービスを提供します。ActivityクラスはContextからの派生クラスです。つまりHelloAndroidクラスはActivityのサブクラスであり、またContextのサブクラスでもあるということになります。そのため、TextViewに対して”this”参照を渡すことができます。

TextViewを生成したら、次に何を表示するかを設定します。

tv.setText("Hello, Android");


特に特筆すべきことはないでしょう。

ここまでで、TextViewの生成と表示するテキストの設定が完了しました。最後に、以下のようにTextViewと画面の関連付けを行います。

setContentView(tv);


ActivityのsetContentView()メソッドは、どのViewがActivityのUIと関連付いているかをシステムに通知します。Activityがこのメソッドを呼びださなければUIは表示されず、真っ黒な画面が表示されます。とりあえず今はテキストを表示したいだけなので、さきほど作成したTextViewを渡しています。

以上でAndroid版”Hello World”が完成しました!次のステップで、実行してみましょう。

”Hello Android!”を実行する
Eclipseプラグインを使えば、アプリケーションの実行が非常に簡単になります。メニューから実行 > 実行ダイアログを開くを選択してください(Eclipse 3.4の場合は、実行 > 実行構成です)。以下のようなダイアログが表示されるはずです。


次に、”Androidアプリケーション”を選択して、左上端のアイコンをクリックするか(端に+マークがある1枚のシートのようなアイコン)、”Androidアプリケーション”をダブルクリックしてください。”新規構成”という名前の新規ランチャーが表示されるはずです。


名前を“Hello, Android”のように何か意味を持った名前に変更し、プロジェクトの参照ボタンをクリックしてプロジェクトを選択してください(Eclipse上で複数のAndroidプロジェクトが存在する場合には、適切なものを選択してください)。プラグインは選択されたプロジェクトにあるActivityサブクラスを自動的に検索し、アクティビティラベルにあるドロップダウンリストに追加します。”Hello, Android”プロジェクトに1つしかアクティビティを持たない場合には、デフォルトアクティビティを選択して次に進んでください。

“適用”ボタンをクリックします。以下に例を示します。


実行を押して、Androidエミュレータを起動し、アプリケーションを実行しましょう。起動後、アプリケーションが表示されるはずです(起動後、MENUキーを押してエミュレータの電話のロックを解除する必要があります)。ここまでの手順を全て完了できていれば、以下のような画面が表示されるはずです。


これで、Android版”Hello, World”は終わりです。すごく簡単だったでしょう?チュートリアルの次のセクションでは、より詳細で有益なAndroid情報を提供していきます。

XMLレイアウトへのUIのアップグレード
完成した“Hello World”の例では、”programmatic”と呼ばれるUIレイアウトを使用しており、ソースコード上で直接アプリケーションのUIを作成しビルドしています。多くのUIプログラミングを経験している方であれば、このやり方がいかに脆弱かをご理解いただけることでしょう。レイアウトを少し変更するだけで、やっかいな問題を引き起こす可能性があります。また、View同士の関連を忘れていまい、レイアウトエラーを引き起こしがちです。その結果、コードをデバッグするのに無駄な時間を浪費することになります。
このため、Androidは代わりとなるUI構築のモデルを提供しています。XMLベースのレイアウトファイルです。例とともに、このコンセプトを説明します。以下は、さきほど完成したプログラムと全く同じ振る舞いをするXMLレイアウトです。



AndroidXMLファイルはシンプルな構造になっています。ツリー構造のタグがあり、各タグ名はViewクラスです(この例では、エレメントが1つだけですが)。XMLレイアウトのタグ名には、自作のViewクラスのようにViewクラスを継承したクラスであればなんでも使用することができます。ソースコード上でやるよりずっと簡単に構造や構文を定義できるので、UIを速く簡単に組み立てることができます。このモデルは、アプリケーションのプレゼンテーション(UI)とデータの登録・検索を行うアプリケーションロジックを分離するというWeb開発モデルからヒントを得ています。

上記の例では、4つの属性を持つ1つのViewエレメント、TextViewがあります。以下にそれぞれの概要を記述します。

属性 意味
xmlns:android XML名前空間の定義です。Android名前空間で定義された共通属性を参照するということをAndroidツールに対して通知します。レイアウトファイルの一番外側には、この属性を含めなければなりません。
android:layout_width Viewが使用する画面の幅を定義します。今回のケースではViewは1つなので、”fill_parent”を設定して画面最大幅を使用しています。
android:layout_height android:layout_width”と同様に、使用する画面の高さを定義します。
android:text TextViewが表示するテキストを設定します。今回の例では、文字列をハードコードする代わりに文字列リソースを使用しています。string変数helloは、res/values/strings.xmlファイルで定義されています。アプリケーションに文字列を挿入したい場合には、この方法を推奨しています。アプリケーションを他の言語に簡単にローカライズできるからです。レイアウトファイルへ変更情報をハードコードする必要がないのです。詳細は、「リソースと国際化」を参照してください。

このレイアウトは、プロジェクトの/res/layout/の下にあります。”res”は”resources”の短縮形で、アプリケーションが必要とするソースコード以外の全てのリソース(画像、ローカライズ文字列、XMLファイルなど)を保持します。

Eclipseプラグインはプロジェクト作成時に自動的にXMLファイル(main.xml)を1つ生成してくれます。以前の例ではこのファイルを使わず、プログラム上でレイアウトを作成しました。フレームワークについての理解を深めてもらうためにそうしましたが、通常はソースコード上に記述する代わりに、XMLファイルでレイアウトを定義してください。

では、XMLレイアウトを使って”Hello, Android”サンプルを変更してみましょう。

1. Eclipseパッケージエクスプローラで、res/layout/フォルダを開き、main.xmlファイルを開いてください(開いた後、XMLソースを見るためには、下のほうにある”main.xml”タブをクリックする必要があるかもしれません)。main.xmlを以下のXMLに置き換えてください。



ファイルを保存してください。

2. プロジェクトのres/values/フォルダにあるstrings.xmlを開いてください。ユーザインターフェース用のデフォルト文字列を保存するフォルダです。Eclipseを使用しているのであれば、ADTがhelloとapp_nameの2つの文字列を作ってくれているはずです。では、helloを何か他のものに変更してください。”Hello, Android! I am a string resource”でもいいでしょう。ファイル全体は以下のようになります。


    Hello, Android! I am a string resource!
    Hello, Android


3. 最後にHelloAndroidのソースコードを修正し、UIをハードコードしている状態からXMLを使うようにします。以下は、変更後のクラスです。

package com.example.hello;

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

public class HelloAndroid extends Activity {
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
    }
}


ソースコードを修正する際には単にコピーアンドペーストせず、Rクラスのコード補完機能を試してみてください。かなり役に立つ機能だということがわかります。

setContentViewにViewオブジェクトを渡す代わりに、レイアウトのリソースの参照を渡しています。リソースはR.layout.mainとして定義されています。これは実際には、layout/main.xmlで定義されたレイアウトをコンパイルしたオブジェクトです。Eclipseプラグインは自動的にプロジェクトのR.javaクラス内にこのレイアウトの参照を作成します。Eclipseプラグインを使っていない場合は、Antでアプリケーションをビルドする際に、R.javaクラスを生成するようにしてください(詳細は以下のRクラスを参照)。

修正が完了したら、アプリケーションを再起動してみましょう。緑の実行(Run)矢印アイコンをクリックするだけです。もしくは、メニューの実行 > ヒストリーの実行 > Hello, Androidからでも実行できます。以前と全く同じものが表示されるはずです。異なる2つのやり方でレイアウトを作成しましたが、最終的には同じ結果になりました。


Ctrl-Shift-F11(Macの場合は、Cmd-Shift-F11)のショートカットを使うと、現在表示されているアプリケーションを実行します。

あなたにとって初めてのAndroidアプリケーションが完成しました!デバッグや他のIDEの使用に関しては、続きを読んでください。先へ進める準備が出来たら、「アプリケーションの基礎」を参照してみてください。また、「デベロッパーズガイド」も併せて参照してみてください。


Rクラス

EclipseのパッケージエクスプローラーのソースコードフォルダからR.javaを開いてみてください。以下のようなものが表示されるはずです。

public final class R {
    public static final class attr {
    }
    public static final class drawable {
        public static final int icon=0x7f020000;
    }
    public static final class layout {
        public static final int main=0x7f030000;
    }
    public static final class string {
        public static final int app_name=0x7f040001;
        public static final int hello=0x7f040000;
    }
}


プロジェクト上のR.javaには、ファイル上で定義された全リソースへのインデックスが記述されています。ソースコードからこのクラスを使用すれば、簡単にプロジェクトに含まれるリソースを参照することができます。この機能は特にEclipseのようなIDEのコード補完機能と組み合わせると強力です。探している参照を素早く、インタラクティブに配置することができます。

もしかしたら、上記とは若干違うものが表示されているかもしれません(恐らく16進数の値が違うかもしれません)。ここでは、内部クラス”layout”とそのメンバ変数”main”を取り上げてみましょう。Eclipseはmain.xmlという名前のXMLレイアウトファイルを参照し、ここにあるようなクラスを生成します。プロジェクトに他のリソース(res/values/string.xmlファイルの文字列やres/drawable/フォルダの描画リソースなど)が追加された場合にも、EclipseはR.javaを変更します。

Eclipseを使っていない場合は、クラスファイルは(Ant toolで)ビルドする際に自動生成されるでしょう。

なお、このファイルを開発者自身が直接編集してはいけません。

プロジェクトのデバッグ
EclipseAndroidプラグインにはEclipseデバッガも統合されています。ソースコード中にバグを埋め込んで、それを実際に確認していきましょう。HelloAndroidソースコードを以下のように変更してください。

package com.android.hello;

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

public class HelloAndroid extends Activity {
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        Object o = null;
        o.toString();
        setContentView(R.layout.main);
    }
}


コード中でNullPointerExceptionを発生させるシンプルなものです。アプリケーションを再起動すると、最終的に以下のような画面が表示されます。

“Force Quit*1”を押してアプリケーションを強制終了し、エミュレータウィンドウを閉じてください。

エラーを特定するために、ソースコード中の”Object o = null;”の行にブレークポイントを置いてください(ソースコードの隣のマーカーバーをダブルクリック)。そして、メニューの実行 > ヒストリーのデバッグ > Hello, Android を選択し、デバッグモードで実行してください。アプリケーションはエミュレータ上で再起動しますが、今回はセットしたブレークポイントに到達した段階で処理を中断します。どんなアプリケーションであっても、Eclipseデバッグパースペクティブでコードをステップ実行することができるのです。

Eclipseなしでプロジェクトを作成
Eclipseを使わない場合(例えば、別のIDEが良い場合や単純にテキストエディタコマンドラインツールを使う場合)、Eclipseプラグインは当然使えません。でも、心配は無用です。Eclipseを使わなくても機能が制限される訳ではありません。

EclipseAndroidプラグインは、実は単にAndroid SDKを含めたツール一式のラッパーなのです(エミュレータやaapt, adb, ddmsなどのツールについては、他の箇所でドキュメント化されています)。このため、”ant”のビルドファイルなど他のツールで、Androidツールをラップすることもできます。

Android SDKには”activitycreator.py”というPhthonスクリプトがあり、ant用のbuilld.xmlと同様にプロジェクトの全ソースコードディレクトリのスタブを作成するのに使えます。このスクリプトを使用すれば、コマンドラインからプロジェクトを構築したり、好きなIDEと統合したりすることができます。

例えば、Eclipseで作ったものと似たようなHelloAndroidプロジェクトを作成するには、このコマンドを実行してください。

activitycreator.py --out HelloAndroid com.android.hello.HelloAndroid


プロジェクトをビルドするには、“ant”を実行します。上記コマンドの実行が成功した後、”bin”ディレクトリの下に、HelloAndroid.apkというファイルが作成されているはずです。.apkファイルはAndroidパッケージのことであり、”adb”ツールを使ってエミュレータ上にインストールし実行することができます。

このツールの使用方法の詳細は、前述したドキュメントを参照してください。

                                                                                                                        • -

Android翻訳目次へ

*1:原文の画面上では”Force close”ボタンなのですが、文中では”Force Quit”となっています。バージョンアップした際の修正漏れですかね。

アプリケーションの基礎

[2009/2/27]サービスとブロードキャストレシーバ、コンテントプロバイダを追加
[2009/3/2]インテントコンポーネントのシャットダウンを追加
[2009/3/3]マニフェストインテントフィルタ、タスクとアクティビティを追加

原文:http://developer.android.com/guide/topics/fundamentals.html

                                                                                                              • -

AndroidアプリケーションはJava言語で記述します。コンパイルされたJavaコードは、アプリケーションで必要なデータやリソースファイルも含めて、aaptツールでAndroidパッケージ(.apt拡張子のアーカイブファイル)にバンドルされます。このファイルはユーザが端末にダウンロードするファイルであり、モバイル端末にインストールしてアプリケーションを描画する際にはこのファイル形式でなければなりません。同一の.apkファイル内にあるコードは全て、1つのアプリケーションであるとみなされます。

Androidアプリケーションは、さまざまな方法で世界中に存在しています。

  • デフォルトでは、各アプリケーションはLinuxプロセス上で動作します。アプリケーションのコードを実行する際、Androidはプロセスを開始します。アプリケーションがシステムリソースを必要としなくなった際には、プロセスをシャットダウンします。
  • 各プロセスは各々でJavaバーチャルマシン(VM)を保持しており、他のアプリケーションからは独立した形で、アプリケーションのコードを実行します。
  • デフォルトでは、各アプリケーションには一意のLinuxユーザIDが割り当てられます。パーミッションが設定されるため、基本的には割り当てられたユーザやアプリケーション自身からしかアプリケーションファイルを参照することができません。ただし、他アプリケーションに公開する方法も用意されています。

2つのアプリケーションで同一のユーザIDを共有することも可能で、その場合は互いのファイルを参照することができるようになります。同一IDでシステムリソースやアプリケーションを保存するということは、同一のLinuxプロセス上で動作することを意味し、同一のVMを共有することになります。

アプリケーションコンポーネント
Androidの主な特徴として、あるアプリケーションが他のアプリケーションの要素を利用できる点が挙げられます(アプリケーションが利用を許可していることが前提です)。例えば、アプリケーションで画像のスクロールリストを表示する場合を考えてみましょう。既に別のアプリケーションがちょうどいいスクローラーを開発していて、他アプリケーションで利用できるようにしてあったとします。その場合、自分自身で開発するのではなく、既に出来上がっているスクローラーを呼び出すことができます。他アプリケーションのコードを統合するのではなく、それにリンクするのです。必要な時に、簡単に他アプリケーションの一部を実行することができます。

これを実現させるため、システムは必要な時にいつでも、アプリケーションプロセスを開始し、Javaオブジェクトのインスタンスを生成できなければなりません。それゆえ、たいていのシステムにあるようなアプリケーションと違って、Androidアプリケーションはアプリケーション内で(例えばmain()ファンクションのような)エントリーポイントを1つも持ちません。そのため、システムは必要な時に必要なコンポーネントインスタンスを作成し、実行することができます。


アクティビティ (Activity)
アクティビティでは、主にユーザ操作に対応するビジュアルユーザインターフェースを提供します。具体例として、アクティビティを利用して、ユーザが選択可能なメニュー項目リストを提供したり、キャプションと共に写真を表示したりすることができます。テキストメッセージングアプリケーションの場合では、あるアクティビティがメッセージの送信アドレスリストを表示し、別のアクティビティが選択されたアドレスへメッセージを書き、また別のアクティビティが古いメッセージを参照し設定を変更したりします。それらのアクティビティは包括した1つのユーザインターフェースとして動作するにもかかわらず、各アクティビティは他とは独立して存在しています。各アクティビティはActivityクラスのサブクラスとして実装されます。

アプリケーションが1つのアクティビティで構成されている場合もあれば、テキストメッセージングアプリケーションのように複数含まれている場合もあります。どのぐらいの数のアクティビティが含まれているかは、もちろん、アプリケーションとその設計に依存します。一般的に、複数のアクティビティのうち1つは、アプリケーション起動時にユーザに最初に提供されるものとなっています。現在のアクティビティが次のアクティビティを開始すると、あるアクティビティから別のアクティビティへ遷移します。

各アクティビティには描画用のデフォルトウィンドウが規定されています。一般的に、ウィンドウは画面全体に表示されますが、画面よりも小さく他のウィンドウの前面に表示されるウィンドウもあります。例えば、アクティビティの途中でユーザのレスポンスを促すポップアップダイアログや、画面上の特定項目を選択した際に、重要情報をユーザに提供するウィンドウなどが挙げられます。アクティビティではそのようなウィンドウを活用することもできます。

ウィンドウで表示される内容は階層化されたビュー(Viewクラスから派生したオブジェクト群)によって提供されます。各ビューはウィンドウ内のある長方形の領域を制御します。親ビューは自分の子供たちのレイアウトも保持しています。枝葉ビュー(階層構造の底辺にあるビュー)は自分達が制御する長方形を描画し、その領域に対して指定されたユーザアクションに対応します。ビューはユーザとアクティビティとの相互のやりとりが発生する場所なのです。例えば、ビューがある小さめの画像を表示したとして、ユーザがその画像をトンとたたいたら、アクションを開始するかもしれません。Androidでは、ボタン、テキストフィールド、スクロールバー、メニュー項目、チェックボックスなど、数多くの既製のビューを提供しています。

階層化されたビューはActivity.setContetnView()メソッドによって、アクティビティのウィンドウ内に置かれます。”content view”とは階層構造のルートにあるViewオブジェクトのことです(Viewや階層構造の詳細情報はユーザインターフェースドキュメントを参照してください)。


サービス (Service)
サービスはビジュアルインターフェースを持っておらず、不特定期間バックグラウンドで実行されます。例えば、ユーザが他の事をしている間に、サービスがバックグラウンドでミュージックを再生しているかもしれません。ネットワーク越しにデータを検索し、何かを計算して適切なアクティビティに結果を返しているかもしれません。各サービスはServiceクラスを継承します。

例として、プレイリストの曲を再生するメディアプレイヤーを取り上げてみます。メディアプレイヤーアプリケーションは、ユーザに曲を選択・再生させるアクティビティを1つ以上は持っているはずです。しかしながら、ミュージック再生自体は、アクティビティによって処理されません。ユーザがメディアプレイヤーを離れて何か違うことをしたとしても、再生を続けるためです。ミュージックを鳴らし続けるために、メディアプレイヤーのアクティビティは、バックグラウンドで実行されるサービスを開始します。システムは、たとえアクティビティが画面から離れたとしても、ミュージック再生サービスを実行し続けます。

実行中のサービスに接続(バインド)することも可能です。(もし実行していなければサービスを開始することもできます)。接続中、サービスが公開するインターフェースを通してサービスと通信することができます。例えば音楽サービスの場合は、インターフェースを通して、ユーザが一時停止、巻戻し、停止、再生を実行することができるでしょう。

アクティビティや他のコンポーネントのように、サービスはアプリケーションプロセスのメインスレッドで実行されます。そのため、他のコンポーネントやユーザインターフェースをブロックしたりはしません。しばしば(ミュージック再生のような)時間のかかるタスクのために別のスレッドを生成することはあります。詳細は「プロセスとスレッド」を参照してください。


ブロードキャストレシーバ (Broadcast receiver)
ブロードキャストレシーバはブロードキャストアナウンスを受け取り対処する以外は何もしないコンポーネントです。多くのブロードキャストはシステムコードから開始されます。例えば、タイムゾーンが変わったり、バッテリーがローになったり、写真が撮られたり、ユーザが言語設定を変更したりした場合などです。また、アプリケーションがブロードキャストを開始することもできます。例えばデータが端末にダウンロードされ利用可能になったことを他のアプリケーションに知らせたりする場合などです。

アプリケーションは、重要と判断したアナウンスに対応するため、制限なくブロードキャストレシーバを保持することができます。全てのレシーバはBoradcastReceiverクラスを継承します。

ブロードキャストレシーバはユーザインターフェースを表示しません。受け取った情報に応じてアクティビティを開始するかもしれませんし、ユーザに通知する通知マネージャ (NotificationManager)を使うかもしれません。ユーザの注意を引くために様々な通知方法が提供されています。バックライトの点滅、端末のバイブレーション、音を鳴らすなどです。一般的に、ステータスバーに配置された永続的なアイコンを開くことで、ユーザはメッセージを取得します。


コンテントプロバイダ (Content Provider)
コンテントプロバイダは、他のアプリケーションが利用可能なアプリケーションデータを作成します。データはファイルシステムSQLiteデータベースなどに格納されます。コンテントプロバイダはContentProviderクラスを継承しており、他のアプリケーションがデータを退避したり格納したりできるような標準的なメソッド群を実装しています。しかしながら、アプリケーションは直接これらのメソッドを呼ばず、代わりにコンテントリゾルバ(ContentResolver)オブジェクトを使って、そのメソッドを呼びます。コンテントリゾルバはコンテントプロバイダと通信することができます。プロセス間通信を管理するプロバイダと協調するということです。

コンテントプロバイダの詳細情報は、「コンテントプロバイダ」ドキュメントを参照してください。

特定のコンポーネントにより処理されるべきリスクエストが発生した際、Androidは常にコンポーネントのアプリケーションプロセスが実行中かを確認し、必要に応じてプロセスを開始します。また、コンポーネントの適切なインスタンスが利用可能かも確認し、必要に応じてインスタンスを生成します。


アクティベート用コンポーネント:インテント (intent)
コンテントプロバイダはコンテントリゾルバからのリクエストによってアクティベートされます。他の3つのコンポーネントである、アクティビティ、サービス、ブロードキャストレシーバに関しては、インテントと呼ばれる非同期メッセージによってアクティベートされます。インテントとは、メッセージ内容を保持するIntentオブジェクトのことです。アクティビティやサービスにとって、インテントはリクエストされているアクションを伝え、とりわけ、実行するデータのURIを特定する役割を担います。例えば、ユーザに画像を提供したり、ユーザにテキストを編集させるために、アクティビティに対してリクエストを運んだりします。ブロードキャストレシーバにとって、インテントオブジェクトはアナウンスされているアクションを伝える存在です。例えば、カメラのボタンが押されたことを関連する関係者にアナウンスするなどが考えられます。

コンポーネントをアクティベートするために、それぞれ別々のメソッドが用意されています。

  • Context.startActivity()やActivity.startActivityForResult()にインテントオブジェクトが渡されることで、アクティビティが起動します(もしくは実行すべき新規の何かが与えられます)。起動したアクティビティは、getIntent()メソッドを呼んで起動するきっかけとなった最初のインテントを参照します。Androidは、アクティビティのonNewIntent()メソッドを呼んで、以降のインテントをアクティビティに渡します。
    • あるアクティビティが次のアクティビティを開始するケースはよくあることです。開始したアクティビティから結果を受け取ることを想定している場合には、startActivity()の代わりにstartActivityForResult()を呼び出します。例えば、ユーザに写真を選ばせるアクティビティを開始した場合には、選択された写真を受け取ることを想定しているはずです。結果は、呼び出し中のアクティビティのonActivityResult()メソッドに渡されたインテントオブジェクトとして返ってきます。
  • Context.startService()にインテントオブジェクトが渡されることによって、サービスが開始します(もしくは実行中のサービスに対して新しい指示が与えられます)。AndroidはサービスのonStart()メソッドを呼び、インテントオブジェクトを渡します。
    • 同様に、呼び出し中のコンポーネントと対象となるサービス間の継続的なコネクションを確立するために、Context.bindService()にインテントを渡すこともできます。サービスはonBind()の呼び出しでインテントオブジェクトを受け取ります(サービスが実行されていない場合は、bindService()で開始することもできます)。例えば、前述したミュージック再生サービスとのコネクションを確立して、再生を制御する方法(ユーザインターフェース)をユーザに提供するとしましょう。その場合、コネクションをセットアップするために、アクティビティがbindService()メソッドを呼び出し、その後、再生に関連するサービスで定義されたメソッドを呼び出します。
    • 以降のセクションである、「リモートプロシージャコール」に、サービスのバインドに関する詳細が記述されています。
  • アプリケーションはContext.sendBroadcast()、Context.sendOrderedBroadcast()、Context.sendStickyBroadcast()など様々な方法によりインテントオブジェクトを渡すことで、ブロードキャストを開始することができます。onReceive()メソッドを呼び出すと、Androidは関連する全てのブロードキャストレシーバへインテントを運びます。

インテントのメッセージに関する詳細は、「インテントインテントフィルタ」を参照してください。


コンポーネントのシャットダウン
コンテントプロバイダはコンテントリゾルバからのリクエストを処理している間だけアクティブです。ブロードキャストレシーバも、ブロードキャストメッセージを処理している間だけアクティブです。そのため、これらのコンポーネントを明示的にシャットダウンする必要はありません。

一方、アクティビティはユーザインターフェースを持っており、ユーザと長期間に渡る通信を行います。たとえアイドル中であったとしても、通信が続く限り、アクティビティはアクティブのままです。同様に、サービスも長期間実行したままの可能性があります。そのため、Androidはアクティビティとサービスをシャットダウンするメソッドを提供しています。

  • finish()メソッドが呼び出されると、アクティビティはシャットダウンされます。finishActivity()を呼び出すことで、あるアクティビティが別のアクティビティ(startActivityForResult()で開始されたもの)をシャットダウンすることも可能です。
  • サービスの場合は、stopSelf()メソッドが呼び出されるか、Context.stopService()が呼び出されることで、停止します。

コンポーネントが既に使われていない場合や、アクティブなコンポーネントのためにAndroidがメモリを回収しなければならない場合に、コンポーネントがシステムによってシャットダウンされる場合があります。後述のセクション、「コンポーネントライフサイクル」で、その可能性と効果について詳細に記述しています。


マニフェストファイル
Androidでは、コンポーネントを開始する前に、そのコンポーネントが存在するかを確認しなければならないため、アプリケーション内のマニフェストファイルでコンポーネントを宣言する必要があります。マニフェストファイルは、Androidパッケージ(.apkファイル)にバンドルされており、アプリケーションのコード、ファイル、リソース情報を保持します。

マニフェストXMLファイル構造となっており、どんなアプリケーションであっても必ずAndroidManifest.xmlという名前が付けられています。マニフェストはアプリケーションコンポーネントの宣言だけではなく、デフォルトのAndroidライブラリにリンクするライブラリの指定や、アプリケーションに付与するパーミッションの指定など、たくさんの情報が記述されます。

しかし、マニフェストの重要な役割はやはり、Androidに対してアプリケーションのコンポーネントを知らせることです。例えば、アクティビティが以下のように宣言されているとしましょう。


    
        
        
        . . .
    


タグのname属性には、アクティビティを実装するActivityのサブクラスを指定します。iconとlabel属性には、ユーザに表示されるアクティビティのアイコンとラベルを格納したリソースを記述します。

他のコンポーネントも同様に宣言します。サービスの場合は、ブロードキャストレシーバの場合は、コンテントプロバイダの場合はです。マニフェストで宣言されていないアクティビティ、サービス、コンテントプロバイダはシステムに表示されず、結果的に実行されません。しかしながら、ブロードキャストレシーバはマニフェストで宣言するか、(ブロードキャストレシーバオブジェクトとして)コードで直接生成するか、Context.registerReceiver()を呼んでシステムに登録するかのいずれでも構いません。

アプリケーションのマニフェストファイルを構築する方法の詳細は、「AndroidManifest.xmlファイル」を参照してください。


インテントフィルタ
インテントオブジェクトは明示的に対象のコンポーネントを指定することができます。仮にそうした場合、Androidは(マニフェストでの宣言をベースにして)コンポーネントを検索し、それをアクティブにします。しかし、もし対象を明示的に指定しない場合、Androidはインテントを処理するのに適したコンポーネントを探さなければなりません。その場合、Androidはインテントオブジェクトと、候補となり得る対象コンポーネントのインテントフィルタを比較します。コンポーネントのインテントフィルタは、Androidにコンポーネントが処理できるインテントの種類を通知します。コンポーネントに関する他の重要な情報と同様、それらはマニフェストファイルで宣言されます。前回の例を拡張し、アクティビティに2つのインテントフィルタを追加したのが、以下の例です。


    
        
            
                
                
            
            
                
                
                
            
        
        . . .
    


この例の最初のフィルタにある、アクション”android.intent.action.MAIN”とカテゴリ”android.intent.category.LAUNCHER”は、よくある組み合わせの1つです。アプリケーションランチャー(端末上でユーザが起動するアプリケーションリストが表示された画面)で表示するアクティビティを登録しています。すなわち、そのアクティビティはアプリケーションのエントリーポイントとなり、ランチャーでアプリケーションを選択した際にユーザが目にする最初のものということになります。

2番目のフィルタは、アクティビティが特定のデータタイプを処理することを宣言するものです。

コンポーネントは無制限にインテントフィルタを保持でき、それぞれが異なった働きをします。フィルタがないアクティビティは、明示的に対象コンポーネントを指定してあるインテントによってのみアクティベートすることができます。

ブロードキャストレシーバをコード内で作成し登録した場合には、インテントフィルタを直接IntentFilterオブジェクトとしてインスタンス化します。他のフィルタは全てマニフェストで定義します。

インテントフィルタに関する詳細は、「インテントとインテントフィルタ」を参照してください。


アクティビティとタスク
前述した通り、アクティビティは異なるアプリケーションで定義された他のアクティビティを開始することができます。仮に例えば、ある箇所のストリートマップをユーザに表示させたいとしましょう。その処理を行うアクティビティが既に存在する場合、あなたのアクティビティがしなければいけないことは、インテントオブジェクトに必要な情報を結びつけ、startActivity()メソッドに渡すだけです。これだけで、マップViewerは地図を表示するはずです。ユーザが戻るキーを押した際には、あなたのアクティビティが画面に再表示されるでしょう。

たとえ、別アプリケーションで定義され別アプリケーションプロセスで実行されていたとしても、ユーザにとってはまるで、マップViewerがあたかもあなたのアクティビティと同じアプリケーション内にあるかのように見えることでしょう。Androidでは、両方のアクティビティを同じタスク内に保持し続けることにより、このようなユーザ操作を実現しています。簡潔に言えば、タスクとはユーザがアプリケーションとして経験するもの、そのものということになるでしょう。スタックに配置された関連するアクティビティのグループと言い換えてもいいでしょう。スタックのルートアクティビティはタスクを開始するアクティビティで、一般的にアプリケーションランチャーでユーザが選択したアクティビティである場合が多いです。スタックのトップにあるアクティビティは実行中のものであり、ユーザが起こすアクションにフォーカスしています。あるアクティビティが別のアクティビティを開始する時は、新規のアクティビティがスタックにプッシュされ、実行中のアクティビティとなります。以前のアクティビティはスタックに残ったままです。ユーザが戻るキーを押すと、現在のアクティビティがスタックからポップアップされ、以前のアクティビティが実行中のアクティビティとして再開します。

スタックはオブジェクトを格納するため、仮にタスクが同一のActivityのサブクラスを複数オープンしてしまった場合には、先ほどの例で言うと、複数のマップViewerが起動することになります。スタックはそれぞれのインスタンスごとに別々のエントリを持てるということです。スタックのアクティビティは決して再配置されることはなく、プッシュとポップアップのみです。

タスクはアクティビティのスタックであり、マニフェストファイルのクラスやエレメントではありません。そのため、アクティビティと独立してタスクの値を設定する方法はありません。一般的にタスクの値はルートアクティビティで設定されます。例えば、次のセクションで「タスクのアフィニティ(affinity)」について論じますが、その値はタスクのルートアクティビティで設定されるアフィニティから読み出されます。

同一タスクにある全てのアクティビティは1つのユニットとして動作します。タスク全体(スタック内の全てのアクティビティ)を、フォアグラウンドに持って来ることもできますし、バックグラウンドに送ることもできます。仮に例えば、現在実行中のタスクがスタックに4つのアクティビティを保持しているとしましょう。現在実行中のアクティビティの下に3つアクティビティがある状態です。ユーザがHOMEキーを押して、アプリケーションランチャーへ移動し、新規のアプリケーション(実際には新規のタスク)を選択した場合、現在のタスクはバックグラウンドへ移動し、新規タスクのルートアクティビティが表示されます。その後、ユーザがホーム画面へ戻り、再度以前のアプリケーション(以前のタスク)を選択したとします。そのタスクは、スタックにある4つのアクティビティとともに、フォワードに来ます。その後ユーザが戻るキーを押しても、画面にはユーザが先ほどまで実行していたアクティビティ(以前のタスクのルートアクティビティ)は表示されません。スタックのトップのアクティビティは削除され、同一タスク内にある1つ前のアクティビティが表示されることになります。

今説明したこの振る舞いは、アクティビティとタスクのデフォルトの振る舞いですが、その振る舞いを変更する方法もあります。アクティビティとタスクの関係、ならびにタスク内のアクティビティの振る舞いは、 アクティビティを開始したインテントオブジェクトに設定されたフラグと、マニフェストファイルので設定されたアクティビティの属性との相互関係によって決められます。リクエストを送信するほうと受信するほうの両方が、処理内容を決める権利を持っているのです。

以下は、主要なインテントのフラグです。

    • FLAG_ACTIVITY_NEW_TASK
    • FLAG_ACTIVITY_CLEAR_TOP
    • FLAG_ACTIVITY_RESET_TASK_IF_NEEDED
    • FLAG_ACTIVITY_SINGLE_TOP

主要な属性です。

    • taskAffinity
    • launchMode
    • allowTaskReparenting
    • clearTaskOnLaunch
    • alwaysRetainTaskState
    • finishOnTaskLaunch

次のセクションでは、上記のフラグと属性が何を意味するのか、どのようにお互いに作用するのか、使用する上での考慮点は何かについて解説します。


(訳注)この章はやたら長いので、一旦ここでアップします。原文ではまだまだ続きがあります。

                                                                                                              • -

仕事が忙しくなってきたため、翻訳のペースが落ちてきてしまっています。そんなとき心の支えになっているのが、「あくせく翻訳」の左上のカウンターだったりします。アクセス数は多くないかもしれませんが、もしかしたら間違って迷いこんだだけなのかもしれませんが、確実に見にきてくださっている人はいる・・・そう思って頑張るようにしています。



Android翻訳目次へ

Androidとは

原文:http://developer.android.com/guide/basics/what-is-android.html

                                                                                                              • -

Androidは、オペレーティングシステムミドルウェア、主要なアプリケーションを含むモバイル端末用のソフトウェアスタックです。Android SDKでは、Java言語を利用してAndroidプラットフォーム上で動作するアプリケーションの開発を始めるのに必要なツールやAPI群を提供します。

特徴

  • アプリケーションフレームワーク コンポーネントの再利用や再配置が可能
  • Dalvikバーチャルマシン モバイル端末用に最適化
  • 統合ブラウザ オープンソースであるWebKitエンジンベース
  • 最適化されたグラフィックス カスタム2DグラフィックスやOpenGL ES 1.0仕様に準拠した3Dグラフィックスを搭載
  • SQLite 構造化データストレージ用
  • メディアサポート 一般的なオーディオ、ビデオ、静止画フォーマット(MPEG4, H.264, MP3, AAC, AMR, JPG, PNG, GIF)対応
  • GSM通信 (ハードウェア依存)
  • Bluetooth、EDGE、3G、WiFi (ハードウェア依存)
  • カメラ、GPS、コンパス、加速度計 (ハードウェア依存)
  • リッチな開発環境 端末エミュレータデバッグ用ツール、メモリやパフォーマンスのプロファイリング、Eclipse IDE用のプラグイン

Androidアーキテクチャ
下記の図は、Androidオペレーティングシステムの主要なコンポーネントを示しています。各セクションについては以下に詳細に記載されています。

アプリケーション
Androidは、Eメールクライアント、SMSプログラム、カレンダー、地図、ブラウザ、コンタクト*1などを含むコアアプリケーションを搭載しています。アプリケーションはJava言語で実装されています。

アプリケーションフレームワーク
開発者はコアアプリケーションで使用されているのと同じフレームワークAPI群にフルアクセスすることができます。アプリケーションのアーキテクチャにはコンポーネントの再利用を容易にする設計がなされています。いかなるアプリケーションであってもその機能を公開することができますし、どんなアプリケーションからでも、(フレームワークで定められているセキュリティ制約に従って)他のアプリケーションの機能を利用することができます。これと同じメカニズムにより、ユーザはコンポーネントを取り替えることができるようになります。

全アプリケーションの基本構成(サービス、システム、含まれるもの)です。

  • リッチで拡張性の高いビューのセット。アプリケーションを開発するのに利用され、リスト、グリッド、テキストボックス、ボタンに加え、組込用Webブラウザも含まれています。
  • コンテントプロバイダ。他のアプリケーションから(アドレス帳のような)データにアクセスしたり、データを共有したりすることができます。
  • リソースマネージャ。ローカライズされた文字列、グラフィックス、レイアウトファイルのような非ソースコードへのアクセスを提供します。
  • 通知マネージャ。全てのアプリケーションがステータスバーにカスタムの警告を表示できるようになります。
  • アクティビティマネージャ。アプリケーションのライフサイクルを管理し、共通のナビゲーション履歴を提供します。

詳細と実例に関しては、「メモ帳チュートリアル」を参照してください。

ライブラリ
AndroidAndroidシステムの多様なコンポーネントで利用されているC/C++ライブラリ群を含んでいます。これらの機能はAndroidアプリケーションフレームワークを通して開発者に公開されています。コアライブラリのいくつかを下記に挙げます。

  • システムCライブラリ BSDによって開発された標準的なCシステムライブラリ(libc)。Linuxベースの組込端末用に最適化。
  • メディアライブラリ PacketVideoのOpenCOREベース。このライブラリは、一般に普及している多くのオーディオ・ビデオフォーマットの再生と記録をサポート。さらに、MPEG4, H.264, AAC, AMR, JPG, PNGを含む静止画像もサポート。
  • サーフィスマネージャ ディスプレイサブシステムへのアクセスを管理。また、複数のアプリケーションから2D及び3Dグラフィックスをシームレスに合成。
  • LibWebCore Androidブラウザと組込Webビューの両方に採用されている最新のWebブラウザエンジン
  • SGL 基礎となる2Dグラフィックスエンジン
  • 3Dライブラリ OpenGL ES 1.0 APIに準拠。ハードウェア3Dアクセラレーション(ハードウェア依存)か内蔵の、高度に最適化された3Dソフトウェアラスタライザーのどちらかを使用。
  • FreeType ビットマップとベクトルフォントレンダリング
  • SQLite 強力で軽いリレーショナルデータベースエンジン。全アプリケーションで利用可能。

Android ランタイム
AndroidJavaのコアライブラリで利用可能な機能とほぼ同様の機能を提供するコアライブラリ群を持っています。

Androidアプリケーションは、Dalvik VMインスタンスを生成することによって、独立したプロセスで動作します。Dalvikは効率的に複数のVMが動作できるように実装されています。Dalvik VMは、少ないメモリ領域でも動作するよう最適化されたDalvik Executable(.dex)フォーマットのファイルを実行します。VMレジスタベースです。Javaコンパイラによってコンパイルされ、標準装備のdxツールで.dexフォーマットに変換されたクラスを実行します。

Dalvik VMはスレッディングやローレベルなメモリ管理のような下位層の機能はLinuxカーネルに依存しています。

Linuxカーネル
Androidはセキュリティ、メモリ管理、プロセス管理、ネットワークスタック、ドライバモデルのようなコアシステムサービスをLinuxバージョン2.6に依存しています。また、カーネルはハードウェアと前述以外のソフトウェアとの間の抽象レイヤとしても振舞います。

                                                                                                              • -

翻訳はここまでです。SDK1.0からの違いはほとんどありません。1.0ドキュメントにはベータバージョンと書かれていたのですが、その記述が消えているぐらいです。
今まで3つに分かれていた訳文を1つにし、原文構成に合わせました。


Android翻訳目次へ

*1:アドレス帳のことだと思います。

えっ?サイト移動!?!?

数週間程前からAndroidの翻訳をはじめ、少しずつ記事が出来上がってきていた頃でした。

SDKのバージョンが1.1に上がり、多少の文章の変更があるかなとは思っていたんですが、バージョン1.1からサイトが移動されていたのには驚きました。

バージョン1.0以前 http://code.google.com/intl/ja/android/documentation.html
バージョン1.1以降 http://developer.android.com/index.html

サイトの雰囲気が全然違いますよね?今までの文章をそのまま使っている箇所もあるのですが、文章構成が大きく変わってしまいました。

勝手に翻訳している身としてはとにかく受け入れるしかありません。バージョン1.0のまま翻訳しきってしまうか、バージョン1.1で翻訳し直すか悩みましたが、最終的には新しいバージョンで翻訳し直すことにしました。

今までの記事と重複した文章が新しくアップされるかもしれませんが、ご容赦くださいませ。とにかく私が翻訳しきる前までに大幅な変更がないことを祈るばかりです。

開発とデバッグ (1)

以下の文章はこちらを参考に翻訳したものです。

                                                                                                                        • -

本ページではAndroidでのアプリケーション開発やデバッグについて記述しており、Androidのコードをどのように作成、ビルド、実行、デバッグすれば良いかを学ぶことができます。なお、Hello Worldチュートリアルから先に学習を始めても構いません。

Androidハードウェアの開発
最初のAndroid端末、「T-Mobile G1」が発売されました!もし、手元に既に端末があって、エミュレータの代わりに実際の端末を使ってアプリケーションの開発やデバッグをしてみたい場合には、「ハードウェア端末での開発」の章をお読みください。

コンテンツ

  • EclipseでのAndroidアプリケーション開発
  • 他のIDEやツールでのAndroidアプリケーション開発
  • 端末ハードウェアでの開発
  • アプリケーションの署名
  • ApiDemosサンプルアプリケーションの利用
  • デバッグ
  • デバッグとテストの設定
  • 重要なデバッグTips
  • Androidアプリケーションのビルドとインストール
  • Androidアプリケーションの削除
  • Eclipse Tips

EclipseでのAndroidアプリケーション開発
Eclipse IDEAndroidアプリケーションの開発をスタートするために、最初にAndroidプロジェクトを作成し、実行構成を設定します。その後、アプリケーションの記述、実行、デバッグを行います。

以下のセクションではEclipse環境にADTプラグインがインストールされていると仮定して説明を行います。ADTプラグインをインストールしていない場合は、以降の説明を読む前にインストールを行ってください。「Eclipseプラグインのインストール」に詳細情報が記述されています。


Androidプロジェクトの作成
ADTプラグインは、新規コードを作成または既存コードを変更する際に素早くEclipseプロジェクトを作成することができる「新規プロジェクトウィザード」を提供します。以下の手順に従って、プロジェクトを作成してください。

1. ファイル > 新規 > プロジェクトを選択します。
2. Android > Androidプロジェクトを選択し、次へを押下します。
3. プロジェクト内容の選択
  * 新規プロジェクトを作成するには、「ワークスペース内に新規プロジェクトを作成」を選択します。プロジェクト名、ベースとなるパッケージ名、.javaファイルのスタブとして作成するアクティビィクラス名、アプリケーション名を入力します。
  * 既存のソースコードからプロジェクトを作成するには、「外部ソースからプロジェクトを作成」を選択します。SDKに含まれているサンプルアプリケーションをビルド、実行したい場合には、このオプションを利用してください。サンプルアプリケーションはSDKのsamples/に配置されています。既存ソースコードが含まれるフォルダを参照して、OKをクリックします。そのフォルダが有効なAndroidマニフェストファイルを含んでいれば、ADTプラグインがパッケージ名、アクティビティ名、アプリケーション名を自動的に入力してくれます。
4. 完了ボタンを押下します。

ADTプラグインは、プロジェクトのタイプに適したフォルダとファイルを作成します。

  • src/ スタブである.javaアクティビティファイルを含むフォルダ。
  • res/ リソースフォルダ。
  • AndroidManifest.xml プロジェクトのマニフェスト
                                                                                                                        • -

さて、私も手順に従ってプロジェクトを作成してみました。まずは新規プロジェクトから。

1. ファイル > 新規 > プロジェクトを選択。
2. Android > Androidプロジェクトを選択し、次へをクリック。すると、Android使ってくれてありがとう的なダイアログが表示されました。Android利用の統計情報をGoogleに送信するか設定するらしいです。私は、“Send usage statictis to Google”のチェックをはずして、続行にしました。
3. 先ほどのダイアログを閉じると、別のエラーのダイアログが出ているではないですか。「The location of the Android SDK has not been setup. Please go to Preferences > Android and set it up.」。何か設定が足りなかったんでしょうか。手順は飛ばしてないと思うんですけどねぇ。仕方ないので、一旦、プロジェクトの作成をキャンセルし、エラーメッセージの指示に従うことにしました。メニューからウィンドウ > 設定を選択して、ダイアログのツリーにあるAndroidを選択します。「SDKロケーション」に、以前ダウンロードして任意の場所に置いたAndroid SDKのフォルダを設定してみました。
4. ではでは、気を取り直して、プロジェクト作成再開。プロジェクト名「FirstProject」、パッケージ名「hatena.akuseku」、アクティビティー名「FirstActivity」、アプリケーション名「FirstApplication」を入力し、完了をクリック!
5. プロジェクトが作成され、Srcフォルダの下に、「hatena.akuseku」パッケージがあって、その下にFirstActivity.javaファイルができました!!

ちなみに、アクティビティーって何なんでしょう?Android実習マニュアル「http://tutorial.jp/prog/android/andman.pdf」によると、「アクティビティーは、Androidアプリケーションの動作の主体となるオブジェクトの一種で、画面を生成する機能を持っている」らしいです。う〜ん。

ついでに既存のサンプルコードもEclipseに取り込んでみます。
1. ファイル > 新規 > プロジェクトを選択から、Android > Androidプロジェクトを選択し、次へを押下。
2. 外部ソースからプロジェクトを作成を選択。ロケーションでダウンロードしたSDKフォルダにあるsampleフォルダ内から好きなサンプルを選択。私はApiDemosを設定して、完了をクリック!
3. プロジェクトが作成されて、サンプルソースコードが見れるようになりました。


Android翻訳目次へ