Activity
読み:アクティビティ
外語:Activity

 画面を持ったAndroidアプリケーションのためのコンポーネントでありオブジェクト。Androidのアプリの基本となる。
目次

概要
 Androidアプリケーションとは、Activityと呼ばれる画面を構成するオブジェクトである。
 ActivityはAndroid上で一つの画面となり、画面上に表示される様々なオブジェクト(入力欄やボタンなど)を管理する。

特徴

ライフサイクル
 Activityは状態遷移図にある通りに状態遷移して機能する。
 Androidでは、この状態遷移を「ライフサイクル」と呼んでいる。

再生成
 通常状態では、画面回転などで状態が変わると「Activityのインスタンスを破棄→Activityを再生成」と動作する。
 これは、縦横でレイアウトを変える必要がある(ことがある)ためで、JavaのプログラムではActivityのonCreate()から再度やり直しとなる。
 Androidアプリの開発で、回転時にActivityを破棄させないためには、AndroidManifest.xml に設定を追加する必要がある。
 android:configChanges="orientation|screenSize"
 orientationを指定すると、onCreate() の代わりに onConfigurationChanged() が動くようになる。
 screenSize は、APIレベル13以上で追加されたもので、APIレベル13以上では screenSize も加えておかないと回転時のActivity破棄を抑止できない。
 なお、アプリ開発に Fragment を使用している場合、Activityとは別にFragment破棄→再生成が行なわれるため、Fragmentでの対策も必要である。

レイアウト
 レイアウトの設定は、Fragmentを使わないActivityのみの従来型Androidアプリと全く同じである。
 AndroidではレイアウトはXMLとして書いて保存するが、縦画面と横画面で切り替えることが可能である。
  1. /res/layout だけに置くと、縦画面でも横画面でも同じものが使われる (これが標準)
  2. /res/layout-port と /res/layout-land に置くと、縦画面は /res/layout-port が、横画面は /res/layout-land が使われる
  3. /res/layout と /res/layout-land に置くと、縦画面は /res/layout が、横画面は /res/layout-land が使われる
 一般には、横画面用に独自のレイアウトを作りたい場合が多いと見込まれるため、3番目の例で対応することが多いと見込まれる。
 プログラムの中で、getResources().getConfiguration().orientation で方向を受け取ったり、Activityのwidth/heightを受け取って比較して判断したりしてレイアウトを切り替えることも可能だが、一般にはこれは冗長な方法である。

リソース
 文字列、数値、レイアウトなどのリソースはContextクラス(=Activity)が持っている。
 非Activityクラスからのアクセスする需要もあるが、この場合、何かしらの方法でContextまたはActivityのインスタンスを渡す必要がある。
 簡単には、コンストラクターの引数にActivityを追加しておき、Activityクラスからインスタンス化する際に引数に this と書けばよい。あちこち持ち回す時はActivityクラスのメンバー変数を用意し、onCreate() で代入しておくと利便がよい。但しこの方法は、Fragmentを使用している時、Activityが再生成された時に面倒なことになるので注意が必要である。

解像度

種類
 Androidでは様々なスクリーンサイズや解像度に対応するため、解像度ごとに名称を与えて解像度ごとに画像が変更可能なっているほか、解像度ごとに変化する画面上で同程度の大きさを表わすdip(dp)という単位も用意されている。
 次のような解像度が定義されている。
 /res/layout-解像度 や res/drawable-解像度 (例 res/drawable-xhdpi ) として、各解像度用のレイアウトと画像を用意できる。
 layoutは、縦画面portと横画面landが選べるため、res/layout-xlarge-land のように画面サイズと縦横を選んでレイアウトと画像を用意することもできる。
 倍率とアイコンの大きさなどの関係は次のとおりで、倍率としては 3:4:6:8:12:16 の関係となっている。

dip(dp)
 解像度に応じて自動で変化する単位が dip または dp である。どちらで書いても同じ機能である。
 dp単位は、160dpiの画面(mdpi)と対応しており、160dpiの画面で 1dp = 1px になる。つまり、320dpiの画面を持つ端末では、1dip = 2px ということになる。
 レイアウトでは、レイアウトのXMLのサイズを全てdipで指定するだけでよく、一つの画面解像度で確認すれば他の解像度でも概ね意図した通りになる。
 しかし、全てのレイアウトをXMLで記述できるわけではない。画像などを画面に表示しようとするとどうしてもプログラムで記述せざるを得ないが、Android APIはpx単位でしか受け付けず、dipには対応していない。そこで比率を得て計算する必要がある。
 現在の画面解像度の比率は以下で取得できる。結果は float 型で戻る。
 getContext().getResources().getDisplayMetrics().scaledDensity
 つまり、dip = scaledDensity * pixel でdip単位を得ることができる。

再検索