Programming_android
Androidのページです
特徴
開発環境について
- Eclipse
- 純正
- Titanium
- HTML+JavaScriptで記述できる開発環境。AndroidとiPhone両方に対応。月額199$と高価。
- DraidDraw
- レイアウトを作成するためのデザイナ。しかしまだまだらしい。
- ドロクリ
- Androidアプリをコーディングなしで生成できるwebサービス。現在はアナログ時計、動画再生、フォトアルバムソフトのみ生成可能。タオソフトウェアが運営。
SDKについて
Eclipse側だけでほぼインストール〜設定可能。Linuxのみ、プロキシに阻まれて(当然プロキシ設定はしている状態で)インストールがうまくいかない。
デバッグ
エミュレータはかなり不安定で、ネットワークに接続されないことや、いつまでたってもアプリが起動しないことが多数あり、何度もエミュレータの再起動を余儀なくされる。可能な限り実機で動かすことを推奨。
ソースコードについて
gitを用いて取得可能、ただし、そのままビルドしても無線LANが動かないなど課題多し。学内から落とす場合、gitが弾かれるため、テザリングするなどして学内のサーバーを経由しない方法で落とす必要がある。
書籍について
現時点ではぐぐれば出てくる情報以上のことは滅多に出てこないので、必要性はお察し。ただし、ホームアプリに関しては『Google Androidプログラミング入門 』くらいしか掲載していない(自分が確認した限りでは)。
アプリケーションアーキテクチャ
ライフサイクル
RAMの空きが減るなどすると、勝手にプロセスを殺す場合がある。そのため、常に強制終了に備えて状態を保存できるようにしておくことが望まれる。
画面構成要素
一画面を構成するactivityクラス(もしくはホーム画面に常駐するappwidget)と,そこに含まれるview,widget,layoutなどのクラスでアプリケーションの画面が構成される。基本的にはプロジェクトを生成する際に作成したactivityがメインのエントリポイントになる。
- application
- activity
- widget
- appwidget
- widget
- activity
| Android SDK | Windows | ex |
|---|---|---|
| activity | form | |
| widget | control | テキストボックス/コンボボックスなど |
| appwidget | widget | デスクトップ時計みたいなウィジェット |
情報の取得
大抵の機能に〜Managerというクラスが存在するので、そこから取得する。しかし扱いが分かりにくく、欲しい情報に限ってManagerが用意されていなかったりする。たとえばバッテリーの情報は、端末内でブロードキャストされているメッセージ(正確には後述するintent)を拾って取得する形になる。
レイアウト・パラメータ
レイアウトやパーミッション・文字列や色などの固定的なパラメータはxmlファイルに記述し、ソースコードと分離する形式となっている。ボタンの状態毎の画像差し替えや、回転などのアニメーションも記述できる。
intent
Androidにおけるデータの受渡しに使うもの。プロセス間通信を行うためのクラス(ネットワーク越しの通信にも対応)。この機能のおかげでアプリケーション間の連携が容易で、ブラウザとブックマークツールの分離やIMEと辞書の分離など、様々な連携が可能。シングルプロセスに適応するため、(少なくともこれまでは)1アプリで多くのことをこなせるように進化してきたiPhoneとは対照的でマルチタスクありきの設計となっている。intentには暗黙的インテントと明示的インテントの二種類が存在する。
- 暗黙的インテント
- 通信先を指定せずにデータを投げる方式。この場合、指定したインテントの形式や送信したデータ(例:URL)に応じて利用できるアプリの一覧が候補として表示され、ユーザが送信先(正確には起動するアプリ)を決定することになる。この機能によって、ブラウザからブックマーク/スナップショット/画面同期、ツイート、地図など様々な別アプリのリソースを利用することができる。
- 明示的インテント
- 通信先のアプリケーションを指定する方式。大抵、特定のアプリケーション(正確にはその中のクラス)を起動させるのに使う。
開発環境
| OS | 安定性(エディタ) | 安定性(エミュレータ) | 速度 | 備考 |
|---|---|---|---|---|
| Windows | △ | △ | △ | エミュレータが不安定で速度も遅い、ネットワーク接続も不安定 |
| Linux | △ | △ | △ | Windowsと大差なし |
| Mac | △ | ○ | ◎ | エミュレータは調子がよければ実機並みの速度、ネットワーク接続安定 |
注意点
- ファイルの扱い
- Androidはファイルの扱いに制限があり、ファイルの入出力においては、各アプリ毎に特定のフォルダにしか干渉できない。(とはいえファイラアプリはあるので何かしら方法はあるはず・・・また、画像の読み込みに関しては別フォルダからでも読み込みに成功している)
参考資料
実際の開発
画面(activity)の作成
アプリの基盤となる画面はactivityクラスを継承して生成する。実際には更にアプリ起動時に表に出すactivityを指定する必要があるが、そこまではプロジェクトの生成で自動的にやってくれる。後はonCreate、onPauseなどの特定のタイミングで呼ばれるメソッドをオーバーライドして所望する処理を記述する。
レイアウトと画面のバインディング
基本的に簡単なレイアウトはxmlで記述し、その内容をactivityのsetConentViewメソッドで画面に反映させる。デフォルトではmain.xmlというファイルがコード中でバインディングされている。
独自の描画処理
既存のwidgetクラスに頼らずに自分で描画を行いたい場合はActivityの代わりにView,SurfaceViewを用いる。Viewは手軽だが、高速描画には向かない。ゲームのように高速で描画を繰り返すような場合にはSurfaceViewを用いる。また、後者であれば画像の回転なども容易に行える。
OpenGL
OpenGLで描画を行う場合は、GLSurfaceViewを用いる。
NDK
まだ未使用
画面を持たないアプリの作成
activityを持たないアプリとして、ホーム画面に常駐するウィジェット/サービス/コンテントプロバイダが存在する。これらを利用する場合は、プロジェクトの生成時に自動生成されたactivityは不要なので、書き換える必要が生じる。
ホーム画面用ウィジェットの制約
ホーム画面に常駐するウィジェットはactivityではなく、appwidgetという専用の画面を持つ。これにはactivityと比べ、設置できるwidgetに制限があり、またコード中でwidget本体には間接的にしか干渉できない(文字や画像を変えようとしてもできない場合が多い)。その上、現時点ではホームアプリ自体の仕様のせいか、ホーム画面が表示されてからタッチが反応するまでに数秒の待ち時間が必要になる。
電力消費と定時処理
定期的に処理を行う方法としては、timerや、サービスで一定時間毎にupdateメソッドを呼び出すように指定する方法などがある。しかし、これらの方法ではアプリが常時起動している必要があるため電力消費が多くなる。そのため、特定時刻にのみ動作を行うAlarmManagerを利用するとよい。AlarmManagerを利用する場合は、起動した際に特定時刻に起動用のintentを投げることになり、無駄な常駐がなくなり、省電力化が可能となる。更にこちらでは更新間隔を可変にできるし、intentで起動するのでより細かい処理が可能になる。
Q&A
- プロジェクトを作成した時点で〜gen〜というエラーでビルドに失敗する
- Project>Cleanすれば直る模様。
Copyright(C) by 芝浦工業大学 工学部通信工学科, 森野研究室. All Rights Reserved.