2010年11月9日火曜日

Android アプリのプロセス

メーラー作ってるときに以前苦労したところなんですが、
Android のプロセス管理ってどうなっているのかという話。

まぁ、普通の話なんですが、アプリを起動した際に立ち上がる
プロセスは一つなので、Activity 起点のアプリを作っている場合は、
UI描画の処理と自分の書いた処理は同じプロセスで行われます。


あ、ここで一つ整理しておきたいんだけど、Android は Linux ベースなので
プロセスが子プロセスをフォークすることでマルチスレッドを実現する
形になっています。実際は Zygote という特別なシステムプロセスが全ての
プロセスを呼び出しているようです。なので、アプリでマルチスレッドを
実現しても、起動プロセスから子プロセスがフォークされるという
わけではないようです。


で、本当に一番最初に Android を触った時は、マルチスレッドを実現
するのに new Thread とかやってみて浮かれていたりしました。

でも、実際には同じプロセス内で動いてるんですよ、こうやっても!

DDMSとにらめっこしながら、壊れてるのかなぁ?とか人のせいに
してみたりしたんですが、やっぱりどうもマルチスレッドになってない
様子。CPU余裕ある状態で処理をさばけないとかあったんで。


ここでやっとドキュメントを調べてみたんです。

当然、こっから色々ありましたが、簡単にまとめるとマルチスレッドを
実現するには以下の様な方法があるようでした。

[AsyncTask]
抽象クラスである AsyncTask を実装して new & execute する。
この方法は Activity と親和性が高く、プログレスやメッセージコールバック
も標準で対応できます。Runnable よりちょっとハイパーですね。

[サービスを利用する]
抽象クラス Service を実装して onStart に処理を記述する方法。
使い方は Runnable みたいなもんですが、Manifest に以下の様な
記述が必要です。

<service
android:name="【サービスを実装したクラス名】"
android:process=":【適当な名前】"
/>

隅カッコは自分の環境に合わせて変えて下さい。name の方はパッケージ
とか、考慮してつけてあげればオーケー。process はプロセス名に
なります。適当で良いのですが、これないと別プロセスが作られない
ので要注意!自分は結構悩みました。com.android.example$blablabla
みたいな名前になります。

[ネイティブアプリと連携]
最近、WEBアプリに大して SDK で組んだアプリをネイティブアプリと
言う事があるようですが、ここでいうネイティブアプリとは NDK を使って
C からコンパイルしたアプリの事。

これはやり方いっぱいあるので、説明割愛!アクションゲームとか
作る人は始めっから使う事前提で考えた方が良いと思います。


まだあるのかな?
自分が知ってるのはこんなもんすかね。

ちなみに、Thread や Runnable は何に使うかというと、UIをプログレス
でロックしてメッセージコールバックしたい時くらいしか使わないのでは
ないかと思っています。

他にあるのかなー??


0 件のコメント:

コメントを投稿