...

Android 小山 圭 IBM STS System X ATS

by user

on
Category: Documents
33

views

Report

Comments

Transcript

Android 小山 圭 IBM STS System X ATS
Android
IBM STS System X ATS
小山 圭
注意
この資料は私が個人的に調査した結果です
‹ 内容の正確性は保証しません
‹
記述時のAndroid SDKはm5です
‹ 0.9及びそれ以降のSDKには対応しません
‹
Agenda
‹
What’s Android?
• Androidとは何でしょう?
‹
Android Anatomy
• Androidの解剖
‹
Android Application Programming
• Android向けアプリケーション開発
デモ
‹ まとめ
‹
What’s Android
What’s Android
‹
携帯電話向けプラットフォーム
• ≠OS
‹
OHA:Open Handset Alliance
• Docomo、KDDI参加
• Willcomなど試験機公開
‹
オープンソース
• GPL部分は公開済み
• 他は正式版(実機)公開後リリース予定
‹
Apache2.0
JavaSEによる開発
‹
既存のJavaMEの問題
• JavaSEとの非互換
同じクラス名でもメソッドの有無が違う
‹ 複雑で多種多用なプロファイルの存在
‹
• Doja、IMP、MIDP、オプションJSRの存在
‹
AndroidはJavaSE5対応
• 基底クラスは皆同じ
• annotationもgenericsもenumも使える
• apache HTTP Client等も標準装備
‹
生産性が全然違う!
• ただし一部のクラスなし(XPathなど)
Android Anatomy
アンドロイドの解剖
Android Architecture
Linux
‹
Android ≠ Linux
• 交換可能、ただしUNIXの設計に依存
‹
‹
‹
Standard Linux 2.6.24に独自パッチ
glibcをサポートしない
パーミッションベースドセキュリティモデル
• 1アプリケーション=1ID
‹
より積極的なパワーマネジメント
• WakeLockの採用
Kernelのソース
http://git.android.com
‹ GPL部分は(当然)全て公開されている
‹
BIONIC
‹
独自libc
• glibc非互換、POSIX非互換
‹
ユーザー空間をGPLから離す
• freeBSD
‹
‹
small
fast
• cutsom pthread
‹
システムプロパティ、logging
Webkit
フルブラウザ
‹ オープンソース
‹
• http://webkit.org
‹
Full CSS, Javascript, DOM, AJAX
support
SQLite
軽量トランザクショナルデータストア
‹ プラットフォームのデータストア
‹
• ほぼ全てのデータがSQLiteにて管理される
‹
ContentProviderにて利用
Hardware Abstraction Layer
‹
‹
‹
ユーザー空間のC/C++ライブラリ層
ハードウェアドライバの実装に必要なインターフェイ
スを定義する
Androidプラットフォームのロジックをハードウェアイ
ンターフェイスから分離する
• ハードウェアメーカーはデバイスドライバを公開したくない
• GNU/Linuxとドライバを分離/独立させる
Dalvik Virtual Machine
独自のクリーンルーム開発仮想機械
‹ 最適化されたフォーマット
‹
• (.dex)
• 非公式解析:
http://www.retrodev.com/android/dexformat.html
‹
Dalvik Byte Code
•
•
•
•
JVM Byte Codeがdexに翻訳される
複数のclassが一つのファイルに最適化
JVM(スタック機械)⇔Dalvik(レジスタ機械)
ARMへの最適化、JIT無し
Android Application
Programming
アプリケーションの開発
開発環境の用意
‹
SDKのダウンロード
• http://code.google.com/android
‹
Eclipseプラグイン
• “software updates”からインストール
• SDKの場所をプラグインに設定してください
‹
CUIでも開発できます
• activityCreate、ant
アプリケーションの構成要素
‹
Activity
• 画面(UI)を持つアプリの基本構成要素
‹
Intent
• アクティビティ間の(非)同期通信パラメータ
‹
Service
• 常駐アプリ、サービス、デーモン
‹
Content Provider
• システムデータストレージへのアクセスを提供
Activity
‹
‹
android.app.Activity
アプレットのようなもの
• main関数はありません
• システムがコールバック関数を呼びます
‹
‹
ビッグクラス:超多機能
ライフサイクルはシステムが管理します
• いきなり消えます
‹
電話受信、アラームオン、バッテリーアラート、等
• いきなり殺されます
‹
携帯ですのでメモリ小さい、バッテリー超重要
• 大切なものはコールバックにて退避して下さい
Hello World!
package com.android.hello;
import android.app.Activity;
import android.os.Bundle;
public class HelloAndroid extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle icicle) {
super.onCreate(icicle);
setContentView(R.layout.main);
}
}
文字列”Hello World!”はどこ?
ディレクトリ構造/リソース
‹
‹
ディレクトリ構造は固定
R.java
• 自動作成識別子
‹
‹
リソース”res”
レイアウト
• Activityの画面設計
‹
drawable
• イメージ等
‹
values
• 可読リソース
• メッセージ
Layout記述xmlファイル
<?xml version="1.0" encoding="utf-8"?>
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:text="Hello, Android"/>
‹
画面設計はXMLにて記述
• プログラムでも書ける
‹
XMLタグ名がAndroidのコンポーネントに対応する
• AndroidのJavaDocにはXML属性の記述がある
• XML属性名と同じ動作を行うメソッド名は一致しない
‹
‹
‹
上記は親(Homeアプリ)を埋める、つまり画面最大
“Hello, World”の文字列はここで設定していた
タグにIDを設定すると自動生成クラスRから参照できる
AndroidManifest.xml
‹
‹
Activityの登録
アプリケーション名、アイコンの登録
• idとリソースの関連に注意
‹
‹
‹
Intent Filterの記述
セキュリティ上の許可を記述
最初は全自動で作成されます
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.android.hello">
<application android:icon="@drawable/icon">
<activity android:name=".HelloAndroid" android:label="@string/app_name">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
values/strings.xml
アプリケーション名
‹ 文字列リソース
‹
• エラーメッセージ等
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="app_name">Hello, Android</string>
</resources>
Activity Life Cycle
http://homepage3.nifty.com/rio_i/lab/android/010lifecycle.html
Activity ライフサイクル
‹
‹
とりあえずこの4つを重視
onCreate
• アプリ(再)スタート地点
• freeze後解凍時にはBundle icicleを利用する
‹
onStart
• 画面作成後、オンメモリでの復帰地点
‹
onPause
• アプリが見えなくなると呼ばれる
• 必要なデータを保存する
‹
onFreeze
(→ Ver0.9: onSaveInstanceState に改名)
• アプリ停止時に呼ばれる
• アプリの状態保存を行う
画面設計
LayoutとViewの関係
‹
Layoutはコンポーネントを並べます
• Viewを詰めます
• 詰め方をレイアウトします
‹
Viewはコンポーネントです
• テキストやボタン等の部品
数がものすごいのでここでは紹介しません
‹ API Demoにほとんどのデモがあります
‹
• でも全部ではないので注意!
Animation
‹
文字通りコンポーネントをアニメする
• フェードイン
• 拡大、縮小、回転、etc
システムに標準でいくつかあります
‹ 自由に作れます
‹
• マトリックス計算
• αブレンディング
‹
view.startAnimation()するだけです!
DroidDraw
‹
‹
レイアウトXML作成ツール/
http://www.droiddraw.org
Intent
Activity間通信
Intent (1/2)
別Activityの実行時にIntentを用いる
‹ アクティビティは通常1画面
‹
• 次の画面に移るときには別のActivityを実行
‹
‹
startActivity, startSubActivity
実行対象の指定が可能
• クラス名の設定
‹
実行対象を知らなくても良い
•
•
Uriやactionを用いたIntentブロードキャスト
manifestにてintent-filterを指定する
Intent (2/2)
‹
Intentには
• 実行Activityの選択
クラス名
‹ URI
‹
• アクションの指定
‹
VIEW,EDIT,UPDATE 等
• 実行先Activityへのパラメータを保持
‹
Uri + Action = Restful
Intent使用例
‹
公式チュートリアルNotepadV2
•
•
•
NoteEditがサブアクティビティClass
SQLiteからパラメータを用意
アクションはACTIVITY_EDIT
@Override
protected void onListItemClick(ListView l, View v, int position, long id) {
super.onListItemClick(l, v, position, id);
Cursor c = mNotesCursor;
c.moveTo(position);
Intent i = new Intent(this, NoteEdit.class);
i.putExtra(NotesDbAdapter.KEY_ROWID, id);
i.putExtra(NotesDbAdapter.KEY_TITLE, c.getString(
c.getColumnIndex(NotesDbAdapter.KEY_TITLE)));
i.putExtra(NotesDbAdapter.KEY_BODY, c.getString(
c.getColumnIndex(NotesDbAdapter.KEY_BODY)));
startSubActivity(i, ACTIVITY_EDIT);
}
Intentの受取
‹
公式チュートリアルNotepadV2
• onCreateの中でgetIntent()
• アクションが1種類しかないので使っていない
Bundle extras = getIntent().getExtras();
if (extras != null) {
String title = extras.getString(NotesDbAdapter.KEY_TITLE);
String body = extras.getString(NotesDbAdapter.KEY_BODY);
mRowId = extras.getLong(NotesDbAdapter.KEY_ROWID);
Intentの受け取り2
‹
公式サンプル NoteListのNoteEditor
• エディタ側にてアクションを判断している
final String action = intent.getAction();
if (action.equals(Intent.EDIT_ACTION)) {
// Requested to edit: set that state, and the data being edited.
mState = STATE_EDIT;
mURI = intent.getData();
} else if (action.equals(Intent.INSERT_ACTION)) {
// Requested to insert: set that state, and create a new entry
// in the container.
Intentの利用例2
‹
Google Map アプリの実行
startActivity(
new Intent(android.content.Intent.VIEW_ACTION,
Uri.parse("geo:49.473367,8.660274")));
※Intentに対する実行アプリは変更できる
AndroidManifest.xmlのIntentFilterの記述にて別アプリが受信可能
http://www.anddev.org/tinytut_-_replacing_system_application_ie_maps-t2105.html
突然ですが、デモします!
Service
Service
画面がなく独立した常駐型プロセス
‹ android.app.Serviceを継承
‹ Intentによる実行、停止、(un)bind
‹ IPC:Inter-Process Communication
‹
• 分散オブジェクト指向
‹
異なるプロセスのオブジェクト間にてメソッド実行
• IDLとStubの使用
IDL記述によるメソッド型の定義
‹ Stubの自動生成
‹
• オブジェクトのシリアライズは用いない
‹
Parcel
AIDL:Android Interface Definition Language
‹
JavaのInterfaceに方向の記述を追加
• in,out,inout, プリミティブは値渡し
Serviceのメソッドを定義する
‹ ファイル拡張子”.aidl”を記述
‹
• Eclipse: 自動的に”.java”ファイルに変換
• CLI: aidlコマンドを利用
‹
Interface.Stubを継承して実装
•
•
Service内にて実装
Service.onBind()にて配布
サービスの実行
Activity
作成/実行
startService(Bundle)
bindService(ServiceConection)
接続
ServiceConnection.onConnect(IBinder)
Interface.Stub.asInterface(IBinder)
取得
Service
Service.registerCallback(Callback)
登録
Service.method()
サービスの利用
Callback.method()
コールバックの利用
Service
ContentProvider
ContentProvider
‹
URI形式でシステムデータにアクセス
• 電話帳など全てのデータはURIでアクセス
• なんとSDカード上のMP3やビデオも!
RESTful
‹ Androidの大切なポイントです!
‹
• データベースを意識しないで高度なデータ管理
‹
でも実装は大変です(笑
• SQLiteに皮被せてます
時間がなくてもデモ
linux上からdbの存在を確認
SDカードの利用/MediaScanner
自作 MP3 Player
Service/Notification
ContentProvider of MP3
はまりどころ
‹
アプレットと同様、タイミングはシビアです
• onCreateではサイズなど取れません
‹
onCreateなどの中では画面更新されません
• Handlerの使用
‹
実行時間がシビアです
• 5秒以内に終らないと殺されます
まとめ
Androidは高レベルな携帯プラットフォーム
です
‹ アーキテクチャがほれぼれします
‹
• さすがGoogleです
生産性高いです
‹ 作ってて楽しい!
‹
• 俺ってスゲーをJavaで体験できます!
‹
Android、始めてみませんか?
補足情報
公式情報
‹
公式サイト
• http://code.google.com/intl/ja/android/
‹
公式コミュニティ
• http://groups.google.co.jp/group/androidSDKJapan
• http://groups.google.co.jp/group/androiddevelopersjapan
• http://groups.google.co.jp/group/androidinternals
‹
Google IO 講演資料
• http://sites.google.com/site/io/
Fly UP