Androidアーキテクチャ設計

 


Androidアーキテクチャ設計


こんにちは、yuです。

前回に引き続きAndroidアプリUIデザイン&プログラミングで学んだ内容を書きたいと思います。
本日はアーキテクチャ設計について。


■機能構造を考える

一般的な観点からAndroidには以下のような基本機能があります。

  1. UI(音楽を再生、画像を表示など)
  2. バックグラウンドによる処理(GPSのデータを記録するなど)
  3. 何らかのイベントを受けて動作する。(日付の変更時にデータを更新するなど)
  4. 他のアプリからデータを得る、共有する。(ブックマークを共有するなど)
  5. タイマー起動(指定した時刻に通知するなど)
  6. 通知機能(指定した時刻に通知するなど)
1〜4については、Androidで設けられた次の4種類のコンポーネントを用いることで実現ができます。
  1. Activity
  2. Service
  3. BroadcastReceiver
  4. ContentProvider
5はシステムのAlarmManager、6も同じくシステムのNotifactionManagerを利用することで実現ができます。

Androidアプリを作る基本の4コンポーネント

Activity

UIを持つアプリは「Activity」を基に作ります。
Activityは開始、終了、割り込み、他のアプリの起動などにより状態が変化するため、
それに応じた処理を実装する必要があります。

Service

バックグラウンドによる処理は「Service」コンポーネントで行われます。
Activity以外のコンポーネントはUIを持つことはできません。
ただし、ServiceはActivityコンポーネントからの開始や終了の処理を受けたり、
データのやり取りをしたりすることでActivityと連携が可能です。

BroadcastReceiver

「Intent」オブジェクトを用いて予め登録していおいたイベントをシステムやアプリが発生したときに動作する仕組みを提供します。
Intentはクラスやパッケージを指定し、データを運ぶ役割を持っています。

ContentProvider

「ContentProvider」コンポーネントはアプリ間のデータ共有を実現します。
データベースを操作するSQLと同様の方法でデータを扱うことができます。

Androidでは上記の4つのコンポーネントをベースにしたクラスを組み合わせてアプリを作ることになります。
その際に下記の3つの項目を理解する必要があります。

 

コンポーネント構成

UIを持つアプリは「Activity」で作成

ActivityはViewオブジェクトによって構成されるUIを表示します。
また、操作時に発生するユーザーイベントを処理します。
 
UI画面が複数にわたる場合はActivityから別のActivityを呼び出すことで画面毎に異なる
Activityで構成することが可能です。
※単一のActivityで複数の画面を呼び出すことも可能です。
 
Activityは必ず画面を表示させなければいけないわけではなく、画面を透明にすることも可能です。
 
10秒以上かかる処理は禁止されているため、時間がかかる処理はメインスレッドではなく別スレッドをたてて実行する必要があります。
 
バックグラウンド処理、特定のイベントや条件による指導、他のアプリとのデータ共有を行わない場合、Activityのみでもアプリは作成可能です。
 

バックグラウンド処理は「Service」で作成

Serviceコンポーネントはバックグラウンドで実行し続けることが可能です。
ただし、メモリ不足で停止される場合があるため、リソースを消費するため連続動作は避けるべきです。
 
C2DMを用いることで必要なデータを送信し、サーバ側で処理することも可能です。
 
ServiceはUIを持っていませんが、WindowManagerを用いることでServiceからでも画面表示を行うことは可能です。

 

イベントによる始動処理は「BroadcastReceiver」で作成

特定のイベントや条件によ始動に関しては、システムやアプリからBroadcast送信されたIntentを受信して動くBroadcastReceiverコンポーネントを用います。
 
受信するIntentの種類の指定はManifestの「intent-filter」に記述します。
ActivityやServiceにより動的にBroadcastReceiverオブジェクトを生成して使う場合はregisterReceiverメソッドでIntentの種類を指定します。



データ共有は「ContentProvider」で作成
 
他のアプリとのデータ共有はContentProviderコンポーネントを基に作ります。
 
 

コンポーネント間の連携とIntent

ユーザーがホーム画面でアイコンを選択したときやタイマー通知でアプリを起動するとき、起動・連携処理は全てIntentオブジェクトを介して実行されます。
 

Intentを扱う上での注意点

・Activity からActivityを開始する場合はUI操作により行うため問題なし。
・Service Broadcast receiver によるActivity呼び出しは突然画面を奪われることになるので避ける。
・直接Activityを呼ぶのではなくNotifactionを経由してユーザーへの通知に留め、ユーザーが選択した場合のみActivityを起動させる。
 

Intent の設定

Intentによる対象アプリの選択は、以下の2通りが存在する。
 
  • 一意となるClass名やパッケージ名、カテゴリ名で選択する明示的な方法。
(例:ブラウザを見るためにはブラウザアプリケーションを指定する必要がある。)
 
 
  • 目的から手段(アプリ)を選択するためにアクション名、カテゴリ名やURIによるデータ("http", "https" など)とmimeType("text/html", "application/xhtml+xml", "image/png" など)を指定する暗黙的な方法。

 

(例:ブラウザを見るためにはブラウザを見るという動作を指定するのみでOK。)
 

 

 

 

 

 

 

 

 
 

 

 

 

 

 

 

 

 

 

Androidマニフェストの設定

システムが対象となるクラスを見つけられるようにするためにAndroidManifest.xmlに以下のような記述を追加する必要があります。
・明示的に選択に必要なパッケージ名やクラス名。
・暗黙的に選択に必要なアクション名やスキームなど。
 
Manifestには上記以外にもアイコンやアプリ名、利用権限などアプリに関する情報を記述します。




■ということで・・・

Androidアプリ開発全般の流れ、Androidアプリのアーキテクチャ設計について
 知りたい方は以下の本をゼヒ読んでみてください。

AndroidアプリUIデザイン&プログラミング  アイデア固めからユーザーフィードバック分析まで

AndroidアプリUIデザイン&プログラミング
アイデア固めからユーザーフィードバック分析まで