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 件のコメント:
コメントを投稿