tanish-kr's learning log

Learning output log

Android

概要

アプリケーションの構成

アクティビティ 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 ウィジェット