Java
Android
,

Androidアプリのコンポーネントについて

More than 1 year has passed since last update.


概要

最近インターン先でAndroidアプリの開発をすることになり、コンポーネントについての理解が足りず苦労したので、勉強したことをメモ代わりに書きます。かなり初歩的な内容なのであんまり参考にはならないかもです:laughing:


勉強に使った本

基本からしっかり身につくAndroidアプリ開発入門


各コンポーネントの概要と役割


アクティビティ

アプリの画面を表示するためのコンポーネントであり、状態保存・復帰や他のコンポーネントを呼び出す仕組みが用意されている。他のアクティビティを呼び出す時、情報をメッセージとしてシステムに伝達する仕組みをインテントという。

フラグメント

アクティビティの持つUIや昨日の一部を表現するもの。画面の大きさによって表示の仕方を変えれることや、まとまったUIやロジックをアクティビティから独立させられるから便利。

サービス

バックグラウンドで動作するコンポーネントであり、UIの提供などを行わない。メインの処理とは別に動かせるため、ユーザーの行動を阻害しない形で処理を行いたい場合や、アクティビティのライフスタイルに影響されずに処理を継続したい場合に便利。ただし、基本的にはアプリと同一のプロセスのメインスレッド上で動作するため、実装する際にはCPUを酷使する処理をそのまま書くのを避け、サービス場でスレッドを立てた上で動作させるべき

コンテントプロバイダ

アプリが管理しているデータへのアクセスを提供するためのコンポーネント。管理しているデータの形式に関係なく、データを取得して操作することができるインターフェースを提供する。Android SDKには最初からいくつかのコンテントプロバイダが用意されているため、カメラで撮影した写真やカレンダー情報、連絡先情報などを簡単に取得・更新することができる。

ブロードキャストレシーバ

ブロードキャストされたインテントを受け取り、処理を行う。インテントのブロードキャストは個別のアプリから行うこともできるが、システムが発行する場合(端末が充電器に接続された時、日付が変わった時など)もある。なお、ブロードキャストレシーバは標準設定では10秒以内に処理を終えなければユーザに対して強制終了するかどうかのダイアログを表示してしまうため、データ更新を行うサービスを呼び出す処理のみに使用し、処理自体は呼び出したサービス側で行うべきである。


コンポーネントのライフサイクル


アクティビティ

状態が変化するごとにコールバックメソッドが呼ばれる。開発者はこのコールバックメソッドにそれぞれの状態に対応した処理を行う。

フラグメント

基本的にはアクティビティと同様にコールバックメソッドに従った処理を記述するが、フラグメントはアクティビティの中に置かれるコンポーネントであるため、アクティビティのライフスタイルの影響を受ける。アクティビティが破壊された場合、そのアクティビティに置かれたフラグメントも破壊される。

サービス

startService()で「開始された」状態と、bindService()によって「バインドされた」状態の2つの起動方法によって異なる形態をとる。前者の場合メモリ不足などによってシステムが停止させられるか明示的に終了しない限り停止しないため、メモリの無駄な占有を防ぐために不要になったら明示的に終了させる必要がある。後者の場合は実行したコンポーネントとサービスが一種のクライアントとサーバーの関係になるため、呼び出し元がバインドを解除すればサービスは停止する。この場合は複数のコンポーネントを同一のサービスにバインドさせることができる。

コンテントプロバイダ

アプリの起動時に生成され、その後はプロセスが続く限り破棄されない。コンテントプロバイダのライフサイクルについては、基本的に意識する必要がない。

ブロードキャストレシーバ

onReceive() の間のみ生存する。onReceive()が終了すると不要なオブジェクトと見なされ、間も無く破棄される。ただし、goAsync()メソッドを読んだ場合、その戻り値であるPendingResultクラスのfinish()メソッドを呼ぶまでは実行可能

(参考)アクティビティのライフサイクル

activity_lifecycle_pic


ライフサイクルの可視化について

各コンポーネントが独自のライフサイクルを持ち、ライフサイクルの各段階で可能な処理が変わることがスマートフォンアプリの複雑さの原因になっている。表示やユーザーの入力といったライフサイクルに影響されやすい処理を受け持つクラスはできる限りシンプルに保つよう設計するべき。そして、ビジネスロジックやデータの永続化といった処理を、アクティビティのライフスタイルに影響されないように設計すべきである。


最後に

以上が、コンポーネントに関する簡単なまとめです。今は電卓やメモ帳を使って勉強している最中なので、また気が向いたら実装に関することをメモがわりに何か書いてみたいと思います。:kissing_closed_eyes: chu☆


石川はまだ寒いです:mask: