概要
アプリケーションの構成
アクティビティ Activity
アプリケーションの「画面」を表すクラス。例えば、アプリケーションい3つの画面が用意されている場合、アクティビティクラスは3つ必要。このクラスは「Activity」のサブクラスとなり、画面の表示時や画面から非表示になったときなど各種イベントに応答が可能。
コンテンツプロバイダ ContentProvider
アプリケーションのデータを外部に公開する際に、窓口となるクラス。このクラスは、「ContentProvider」のサブクラスとなります。外部より、コンテンツの要求を受けたときに行う振る舞いを規定する必要があります。電話帳のデータ公開など
サービス Service
画面には表示されず、バックグラウンドで行われるデータの処理をするのに使われます。このクラスは「Service」のサブクラスとなります。開始時及び、終了時、また、実際に定期的に行う処理などを規定します。天気予報やRSSなどインターネット上のデータを定期的に受信する必要のあるアプリケーション
ブロードキャストレシーバ BroadcastReceiver
電池が消耗した、日付・時刻が変更されたなど、システムから全てのアプリケーションに向けて送られるメッセージを受け取るレシーバを表すクラスです。「BroadcastReceiver」クラスのサブクラスとなり、ブロードキャストメッセージを受け取ったときの動作を規定します。バッテリー状況を表示するアプリケーション、時計など時刻によって変わるアプリケーションなど
ダイアログ
例外としてアクティビティのようにクラスとして作成する必要の無い「ダイアログ」というものがあります。メッセージを表示するのみのAlertDialog、何らかの動作が進行中である事を示すProgressDialogなどのクラスが用意されています。
AndroidManifest
アクティビティ、コンテンツプロバイダ、サービス、ブロードキャストレシーバの4種類のクラスはAndroidManifest.xmlというファイルに定義される事で初めて機能として呼び出しが可能となる。この中にはアクティビティの情報だけでなく、アプリケーションの名称、使用するアイコン、必要とする権限など、アプリケーションの挙動を示す全ての情報が詰まっています。
Androidアプリケーションのパッケージ
Androidのアプリケーションはapk(Android Packege)という形式のファイルにパッケージされます。このapkファイルはclasses.dexという実行ファイル、リソース、AndroidManifest.xmlの3種類のファイルをZIP形式により圧縮した物です。 classes.dexとは、Andoridツールによりコンパイル済のJAVAクラスをまとめたバイナリファイルとなっています。 Androidでは、このファイルが実行バイナリとして、VM(仮想マシン)上で実行されます。
Androidアプリケーションの実行の仕組み
Androidアプリケーションは、Dalvikと呼ばれる独自の仮想マシン上で動作をしています。このDalvik VM は携帯電話のような少ないメモリ環境の為に最適化されています。 apkファイルに格納されたdexファイルは、Dalvik VMによる実行時にapkファイルにより抽出され、Dalvik VM上で実行されます。
odexファイル
アプリケーションによっては、apkとは別にodexという拡張子を持つファイルがあります。 これはOptimized DEXといい、特定の端末に向けて最適化されたdexファイルです。必要に応じてキャッシュファイルとしてAndroidシステムによって生成されます。(/date/dalvik-chace/ディレクトリに格納される) 端末によっては、プリインストールアプリケーションをあらかじめodexとapkにわけて/system/app/ディレクトリに格納する事で、/dataディレクトリは以下の容量を節約している端末もあります。なお、odexとapkの組によって配布されているアプリケーションでは、最適化前のdexファイルは不要になるため、apkからdexファイルは削除するのが普通です。
アクティビティとインテント
インテントとはAndroidフレームワークにて用意されているオブジェクトの一つで、アクティビティやサービスを起動する為の重要な要素です。
明示的インテントと暗黙的インテント
アクティビティは常にインテントにより呼び出されるようになっており、アプリケーションは、システムが必要と判断したときに起動されます。 また、インテントには明示的インテントと暗黙的インテントがあります。 明示的インテントとは、アプリケーションのパッケージ名とアクティビティクラス名を指定するタイプのインテントの事で、そこから起動するアクティビティは常に一意となります。アプリケーションをホーム画面から起動した時、アプリケーション内部で他のアクティビティを表示させる際に使用するアクティビティが、これに当たります。 暗黙的インテントとは、アクティビティのクラス名を指定せず、「目的の動作に反応出来るアクティビティ」を呼び出すインテントです。「○○ファイルを扱う事が出来るアプリケーション」といった指定を行うタイプの物が、この暗黙的インテントに当たります。
代表的なアクション
あらかじめIntentクラスに用意された定数を用いる
定数名 | 内容 |
---|---|
ACTION_MAIN | アプリケーションのエントリポイントであることを示すアクション。ホーム画面からアプリケーションが起動されたとき、この値がアクションとして設定されます。 |
ACTION_VIEW | 何らかのデータを表示する事を示すアクション。ブラウザにてURLをクリックしたときにテキストファイルや画像を表示する必要があるときに、この値がアクションとして設定されます。 |
ACTION_SENDTO | 何らかのデータを送信する事を示すアクション。メールを送信する必要があるときに、この値がアクションとして設定される |
暗黙的インテントの種類
暗黙的インテントは、目的の動作をアクション名で表します。 インテントは一つのアクション、複数のカテゴリおよび、任意のデータの格納が可能です。
暗黙的インテントとインテントフィルタ
アクティビティがどのようなインテントに応答出来るかは、インテントフィルタを使用します。 このインテントフィルタは、AndroidManifestへの要素の記述や実行コード内での記述により定義する事が出来ます。インテントフィルタは次の要素により構成されます。
名前 | 内容 |
---|---|
action | インテントが応答出来るアクションを文字列で指定します。この要素は必須であり、一つ以上のアクションを指定する事が出来ます。 |
category | インテントが応答出来るアクションのカテゴリを文字列で指定します。 |
data | インテントのデータに含まれている文字列やリソースのMIMEタイプを指定します。例えばhttpスキームが指定されている場合に反応するインテントフィルタや、特定のサイトのURLが含まれている場合に反応するインテントフィルタを定義する際には、これを使用します。 |
Androidのマルチタスク
Androidのマルチタスクは、PCなどのマルチタスクとは異なったマルチタスクの仕組みを実装しています。 Androidのマルチタスクは、ブラウザのタブ(ウィンドウ)に似ています。一つのタスクはバックスタックと呼ばれるスタックを持ち、その中にアクティビティがスタックされます。 このタスクを必要に応じて切り替えることで、マルチタスクを実現しています。 アクティビティは起動するごとに、現在アクティブなバックスタックにスタックされていきます。この際アクティビティがどのアプリケーションのものであるかどうかは重要ではなく、異なるアプリケーションのアクティビティであっても、アクティビティの呼び出し方次第では同じバックスタックにスタックされます。 こうしてスタックされたアクティビティは、端末の「Back」キーを押す事によって辿られ、そのとき表示していたアクティビティが破棄されます。
タスクの切り替え
タスクの切り替えは、ホームキーを押したり、ホーム画面でアプリケーションアイコンがタップされたときなどにおこります。新しく作成されるアクティビティは今までとは異なるタスクに属する事となり、元のタスクは休眠状態となります。 このようにして、ユーザー操作により必要になったとき、タスクが切り替えられます。そして、休眠状態となったタスクは、時間が経ち、保持の必要が無いときとOSに判断されたときに、自動的に終了されます。ユーザが明示的にタスクを切り替えたり、終了されたりする手段は、用意されていません。(ただし、第三者のアプリケーションや、端末の組み込み機能により、タスク管理機能が提供されている事もあります。)
タスクを越えたデータ共有
タスクはそのアクティビティが属するアプリケーションに関係なく動作します。そのため、一つのアプリケーションに属するアクティビティが複数のタスクに存在したり、複数のタスクに同一のアクティビティが作成されるケースが存在します。 このとき、タスクを越えて、一つのアプリケーションに属する為、異なるタスク間に属するアクティビティでのデータや処理を共有する事が出来ます。
Androidの権限モデル
Androidは、アプリケーションのAPI実行に権限による制限を設けています。この権限が指定されていない場合、アプリケーションはAPIを実行出来ず、API呼び出し時に例外が発生します。 アプリケーションインストールの際にはこの一覧が必ずユーザに提示され、使用しても問題無いかどうかを確認するようになっています。
代表的な権限
名前 | 内容 |
---|---|
android.permission.INTERNET | インターネットアクセスをするのに必要な権限。権限がない場合、HTTPなどのインターネット通信処理クラスの動作が失敗します。 |
android.permission.CALL_PHONE | 電話をかけるのに必要な権限。権限が無い場合、電話アプリケーションへのインテント送信が失敗します。 |
android.permission.READ_CONTACTS | Android標準の電話帳のデータ取得に必要な権限。権限が無い場合、アプリケーションが電話帳のデータを参照することが出来ません |
android.permission.WRITE_CONTACTS | Android標準の電話帳にデータを書き込む際に必要となる権限。権限が無い場合、アプリケーションが電話帳のデータを更新したり、書き込む事が出来ません |
android.permission.READ_PHONE_STATE | 端末の製造番号や電話番号などを取得します。権限がない場合、アプリケーションがこれらの情報にアクセスすることが出来ません |
コンポーネント
アプリケーションフレームワークを構成するコンポーネント
名前 | 内容 |
---|---|
Activity Manager | アプリケーションのライフサイクルを管理 |
Window Manager | ウィンドウを管理 |
Content Providers | アプリケーション間のデータ共有を管理 |
View System | ユーザーインタフェースを管理 |
Notification Manager | ステータスバーへのアラート表示を管理 |
Package Manager | インストールを管理 |
Telephony Manager | 電話機能を管理 |
Resource Manager | リソースを管理 |
Location Manager | 位置情報を管理 |
XMPP Service | メッセージングサービスを管理 |
ライブラリを構成するコンポーネント
名前 | 内容 |
---|---|
Surface Manager | 複数アプリケーション間の2D/3Dグラフィックスを合成するライブラリ |
Media Framework | ビデオ形式の再生と記録のライブラリ |
SQLite | リレーショナルデータベースのライブラリ |
OpenGL/ES | 3Dグラフィックスエンジン |
FreeType | ビットマップとベクターフォントのレンダリングを行うライブラリ |
WebKit | ブラウザ表示を行うためのHTMLレンダリングエンジン |
SGL | 2Dグラフィックエンジン |
SSL | SSLのライブラリ |
libc | 標準的なC言語ライブラリ |
Androidのクラスライブラリ
Javaの標準APIライブラリ
名前 | 内容 |
---|---|
java.awt.font | フォント |
java.io | IO |
java.lang | 基本 |
java.math | 数値演算 |
java.net | 通信 |
java.nio | 新IO |
java.security | セキュリティ |
java.sql | SQL |
java.text | テキスト |
java.util | ユーティリティ |
AndroidのAPIパッケージ
名前 | 内容 |
---|---|
android | リソース |
android.app | アプリケーション |
android.content | 公開情報へのアクセス |
android.database | データベースへのアクセス |
android.graphics | グラフィックス |
android.hardware | ハードウェア制御 |
android.location | 位置情報 |
android.media | メディアプレイヤー |
android.net | 通信 |
android.opengl | OpenGL |
android.os | OSシステムサービス |
android.preference | プレファレンス |
android.provider | コンテストプロバイダ |
android.sax | SAX |
android.telephony | 通話 |
android.test | テスト |
android.text | テキスト |
android.util | ユーティリティ |
android.view | ビュー |
android.webkit | HTMLレンダリング |
android.widget | ウィジェット |