Loading presentation...

Present Remotely

Send the link below via email or IM

Copy

Present to your audience

Start remote presentation

  • Invited audience members will follow you as you navigate and present
  • People invited to a presentation do not need a Prezi account
  • This link expires 10 minutes after you close the presentation
  • A maximum of 30 users can follow your presentation
  • Learn more about this feature in our knowledge base article

Do you really want to delete this prezi?

Neither you, nor the coeditors you shared it with will be able to recover it again.

DeleteCancel

Make your likes visible on Facebook?

Connect your Facebook account to Prezi and let your likes appear on your timeline.
You can change this under Settings & Account at any time.

No, thanks

touhoku_7

No description
by

daichi sasaki

on 1 July 2010

Comments (0)

Please log in to add your comment.

Report abuse

Transcript of touhoku_7

アプリ開発の注意点 アイフォーコム東北(株)
      佐々木 大地 -自己紹介- ササキダイチ 青森県出身

業務経歴
・1~4年目:COBOL/VBA(Excel/Access 95/97)

・5~7年目:C言語

・8~9年目:Java/C++/C# ↑この頃Androidやってました 発表の内容


・アプリの基本構造について

・実際に作成して躓いたところと解決方法

・各種UI部品について
・アプリケーションの構成

 ・言語:Java(Dalvik VM上で動くJava)

 ・コンポーネント

  ・Activity ・・・ どのような画面を持つか

  ・Intent Receiver ・・・ どのような機能を提供するか

  ・Service ・・・ どのように動作しているか

  ・Content Provider・・・ どのようなデータを提供してくれるか AndroidManifest.xml Serviceについて Activity

・アプリケーションの画面を作るコンポーネント 躓いた石:1個目 シングルスレッドモデル 躓いた石:2個目 サイズ指定 Androidのアーキテクチャ -Dalvik Virtual Machine -

Dalvikは通常のJava仮想マシンとは異なり、
メモリの消費が低く抑えられているなど、
モバイル向けに最適化された設計となっている Javaソースコード(.java)


[コンパイル]


Javaクラスファイル(.class)


[リコンパイル]


Dalvik Executable(.dex)


[パッケージング]


Android Package(.apk) Dalvik VM 実行形式 by Wikipedia 実際に出来上がる物としての違いはなに? アプリケーションのライフサイクルを決定や、起動スタックの管理、アプリケーション連携などの機能を提供する Windowサービスとの管理を行うコンポーネント 他アプリのデータや共有データにアクセスするために使用される さまざまなGUIを提供する メールなどの割り込みを利用者に通知する仕組みを提供 配信するPKGファイルの情報を取得・管理するコンポーネント 音声発着信に関係する音声コンポーネント ソース以外の文字列、描画データ、レイアウトデータなどを管理するコンポーネント 位置情報に関係する管理コンポーネント XMPPを用いたメッセージングに関係する管理コンポーネント <?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="jp.test"
android:versionCode="1"
android:versionName="1.0">
<application android:icon="@drawable/icon" android:label="@string/app_name">
<activity android:name=".test"
android:label="@string/app_name">
<intent-filter>
(略)
</intent-filter>
</activity>

<receiver>
(略)
</receiver>

<service>
(略)
</service>

<provider>
(略)
</provider>
</application>
</manifest> アプリケーションを構成する画面は、どの画面もActivityを使って生成されます Activityインスタンス Activity
A Activity
B Activity
C Activityクラス Activityクラス 画面遷移 画面遷移の基本パターンは「進む」と「戻る」の動作です。
画面を先に進める度に履歴スタック(ヒストリースタック)へ、
新しく生成した画面の情報を積み重ねて保管します。 履歴スタック A B
A C
B
A 履歴スタック

A
B
A C
B
A 戻る動作 × × Javaソースコード(.java)


[コンパイル]


Javaクラスファイル(.class)


[パッケージング]


Java ARchive(.jar) Java VM 実行形式 Intent Intent Intent Intent Intent アプリケーションの遷移にはIntentが用いられています。
動作要求が記述されたメッセージのようなものです。

一方で受け取る側にはIntentFilterがあり、
受け取ったメッセージを受け付けるかどうか、
または受け取った際に表示する画面(Activity)があるかどうか判断します ↑ActivityManagerとカーネル
Intentを受け取れるのは,四つのコンポーネントのうち
ActivityとIntent Receiverの二つ。
すべてバックグラウンドで通信する場合はIntent Receiverとして実装する ライフサイクルについて Intentの種類

・明示的なIntent(Explicit Intents)
 ・クラス名を明示的に指定 ex)com.android.settings.Settings ・暗黙的なIntent(Implicit Intents)
 ・UriでDataやTypeを記述し、それを元にIntent-filterに一致するアプリケーションを起動する。
  ex)tel:0120******
  ex)http://www.google.com 同一のIntent-filterがある場合は、ユーザーに選択を促す。
これを活用すれば、再利用の機会が多く得ることができ、
第三者のアプリケーションに使用してもらえるかもしれない。 - 第7回日本Androidの会東北支部発信会 - 状態に応じて各メソッドが実行される。
それぞれを必要に応じて定義しなければならない。
(onCreateだけは必須)

特に起動時・再実行時に実行されるonResumeや
停止時に実行されるonPauseはアプリ実行に
必要なデータの読込・保存を実装する必要がある。
(割り込み処理(電話など)を考慮する必要があるため) 画面を持たずにバックグラウンドで処理される機能。
(WindowsのサービスやLinuxのデーモンと似たもの)

Activityからサービスに接続(バインド)して操作します。
接続にはRPC(RemoteProcedureCall)を使います。
(WindowsのCOMで使うのと同じ?です)
ただしIDLではなくAIDL(Android Interface Definition Language)
というインターフェースを定義します。 サービスのライフサイクル [開始]

onCreate

onStart

[実行中]

onDestroy

[終了] Androidはマルチスレッドですが、UI操作はシングルスレッドモデルなため、
UIを持つスレッド(Activity)以外からUI操作を行うと
CalledFromWrongThreadExceptionでエラーが発生してしまいます ┌────┐
│サービス│
└────┘ ┌─────┐
│Activity │
│ │
│ │
│ │
│ │
│ │
│ │
│ │
└─────┘ ×ダイアログ表示 ┌────┐
│サービス│
└────┘ ┌────────┐
│Activity │
│ │
│ │
│ │
│ │
│ │
│ │
│ │
└────────┘ ①ダイアログ表示を依頼(Message) これを回避するためにはHandlerを用いて、UIを持つスレッドに
ジョブ(ここでは画面操作)を登録します。
UIスレッドが登録されたジョブを実行することにより、
スレッドチェックで例外が発生しないことになります。 ┌────┐
│Handler │
└────┘ ②ダイアログを表示 Androidでは複数の解像度の端末があるため、
各端末で共通の大きさになるように指定する必要があります。

ピクセルでレイアウトを設計すると、高解像度の画面では小さく表示されたり、
その逆が発生したりしてレイアウトが崩れる可能性があります。

またレイアウトでAbsoluteLayout(絶対座標レイアウト)を使用すると
同じくレイアウトが崩れる可能性があります。 画面の縦・横切り替え 端末を傾けることで画面を縦・横と切り替えることができますが、
そのときアプリは画面の再構築を行うのではなく、OSによって「Activityが再起動」されます。

デバイスのコンフィグ(ここでは縦横切替)が変更されたとき、
UIはそのコンフィグに適用する必要があるためActivityが再起動されます。

再起動時のライフサイクルはonPause()→onStop()→onDestroy()を経てonCreate()が呼ばれます。

ここで注意するべき点としては一度Destroyされるため、
インスタンスが破棄される点です。

Activityを参照しているオブジェクトがある場合は、
そのオブジェクトが生きてる間、メモリ解放されないことになります。

また再起動されるため、各インスタンスが破棄されてしまいます

┌─────┐
│Activity │
│ │
│ │
│ │
│ │
│ │
│ │
│ │
└─────┘ ┌───┐
│ View │
└───┘ ┌────┐
│Drawable│
└────┘ ・お手軽回避策その1
 画面の縦横切替を禁止する!
 AndroidManifest.xml Activityタグに向き固定を記述する
 ・縦固定
  android:screenOrientation="portrait"
 ・横固定
  android:screenOrientation="landscape" ・再起動を考慮したコーディング
 onSaveInstanceState(Bundle) で保存し、
 onRestoreInstanceState(Bundle) で読み出します。
 onCreate(Bundle)でも読み出せます。  例:
 protected void onSaveInstanceState(Bundle outState) {
  super.onSaveInstanceState(outState);
  outState.putString("hogeKey", hoge);
 }

 protected void onRestoreInstanceState(Bundle savedInstanceState) {
  super.onRestoreInstanceState(savedInstanceState);
  String hoge = savedInstanceState.getString("hogeKey");
 } ・お手軽回避策その2
 縦横切替などコンフィグが変更されてもアプリを再起動しないようにする。
 AndroidManifest.xml Activityタグに以下を記述
 ・縦横が切り替わったとき
  android:configChanges="orientation"

 ※「再起動しないようにする」ではなく、
  「再スタートされる代わりにonConfigurationChangedがコールされる」ですが・・・。
 ※ここに指定したコンフィグ以外による変更時はアプリが再起動されます。 <activity android:allowTaskReparenting=["true" | "false"]
android:alwaysRetainTaskState=["true" | "false"]
android:clearTaskOnLaunch=["true" | "false"]
android:configChanges=["mcc", "mnc", "locale",
"touchscreen", "keyboard", "keyboardHidden",
"navigation", "orientation", "screenLayout",
"fontScale", "uiMode"]
android:enabled=["true" | "false"]
android:excludeFromRecents=["true" | "false"]
android:exported=["true" | "false"]
android:finishOnTaskLaunch=["true" | "false"]
android:icon="drawable resource"
android:label="string resource"
android:launchMode=["multiple" | "singleTop" |
"singleTask" | "singleInstance"]
android:multiprocess=["true" | "false"]
android:name="string"
android:noHistory=["true" | "false"]
android:permission="string"
android:process="string"
android:screenOrientation=["unspecified" | "user" | "behind" |
"landscape" | "portrait" |
"sensor" | "nosensor"]
android:stateNotNeeded=["true" | "false"]
android:taskAffinity="string"
android:theme="resource or theme"
android:windowSoftInputMode=["stateUnspecified",
"stateUnchanged", "stateHidden",
"stateAlwaysHidden", "stateVisible",
"stateAlwaysVisible", "adjustUnspecified",
"adjustResize", "adjustPan"] >
. . .
</activity> 躓いた石:3個目 ・レイアウト設計時の単位はdipを使用するのがベター。
 ちなみにdipの計算式
 pixels = dips * (density / 160)
 ※density = 低解像度(120):中解像度(160):高解像度(240)

・フォントサイズはspを使うのがベター(dpと似たようなもの。)
 プログラム中ではspでフォントサイズを指定することができないため、
 xmlであらかじめ定義しておくと便利。
 dimes.xml
  <?xml version="1.0" encoding="utf-8"?>
  <resources>
   <dimen name="font_size_10sp">10sp</dimen>
  </resources>
 コード
  float fontsize = getResources().getDimension(R.dimen.font_size_10sp);

・AbsoluteLayoutは使わず他のレイアウトを駆使する。(1.5から非推奨になってます)
Viewクラスツリー 画面を表示するためにActivityを利用しますが、これ自体はコンテナとなっているため、
ViewやWidgetといった表示する部品を並べて画面を構築していきます。 Button→ EditText→ CheckBox→ RadioButton→ ToggleButton→ Spinner→ AutoComplete - UI部品を一部紹介 - DatePickerDialog TimePickerDialog Gallery→ ImageSwitcher→ VideoView→ - 最後に - 質問や疑問があればどうぞ!

実際にAndroidで躓いたところとか、Android始める前の疑問でもなんでも。 答えられなくてもきっとだれか答えてくれるはず・・・。 ご静聴ありがとうございました! MediaController→ - ちょっとここで、とあるアプリの紹介 - 発表で参考した資料 Google Android入門 ~携帯電話開発の新技術 adamrockerさん
http://www.adamrocker.com/blog/
Full transcript