Androidのマルチタスクの話をしてみる(2)

あくまでAndroid開発者ではない、iPhoneユーザとか非開発者向けの話です。
前回の後、ブコメで疑問が付いてたのでサービス(Service)の話を簡単に。


Androidにおけるいわゆるマルチタスクは物凄く大雑把に言うと二つの側面があります。
ユーザから見た時のいわゆるマルチタスク = Androidの”Activity” = iPhoneOS4.0の”Fast App Switching”(多分)
 これは作業中のアプリを他に切り替え、一旦バックグラウンドに回したアプリが、またフォアグランドに戻してもまたさっきの状態から再開できる、というものです。
 Androidではメモリの空き状況に応じて、アプリをバックグラウンドでスリープさせておく、もしくは状態情報だけを保存して一旦終了してしまう(そして必要に応じて起動しなおしレジュームする)、というやり方で実現されます。
 この機能では、バックグラウンドアプリが増えることでバッテリ消費が増えることはありません。また、(見た目の)バックグラウンドアプリが溜まってもフォアグラウンドアプリの処理速度が落ちることはありません
 ただし、バックグラウンドアプリが一杯溜まると、かなり前に使ったアプリに切り替えたい時に(知らんうちに終了されているため再起動→レジュームとなり)時間が掛かることがあります。
 この機能では、複数のアプリが同時に処理を実行することはありません。あくまでユーザの入力に応じて画面を表示する部分であり、バックグラウンドであれば何もすることはないのです。
 ここまでおさらい。
バックグラウンドで処理が走るという意味でのマルチタスク = Androidの”Service” = iPhoneOS4.0の”Multitasking”全般(多分)
 この機能はアクティビティの状態に関係なく処理を走らせることが出来ます。また、終話ボタンを押して画面オフにした端末スリープ状態でも走らせることが出来ます。
 ユーザ操作に対して応答するようなインタラクティブな処理はアクティビティで行い、バックグラウンドで行いたいような処理だけをサービスに委託するような感じです。
 サービスは使用法によっては顕著にバッテリを消耗する可能性があります。例えば端末状態に関係なく1分間隔で通信するとかいうアプリを書いたらとんでもないことになります。
 芋煮のバッテリ消費についてはよく分かりません。使ったことないので。
 Tuboroidに関しては30分間隔くらいならバッテリへのインパクトはほとんどないと思います。俺はHT-03AでTuboroidの更新チェックを15分間隔で使ってますが1日以上は余裕で持ちます。
 まぁ構造上「行儀の悪い」アプリを書かれる危険性自体はAndroidにしてもiPhoneにしても同様に存在し、同じようなアプリを書く限りバッテリへのインパクトも同等と思われます。例えばiPhoneも無駄にVoIP開きっぱにされたりしたら多分軽く死ねるんじゃないですかね。
 ただ、iPhoneの方がサービスの柔軟性は相当低そうなので、Androidの方が容易に行儀の悪いことが出来てしまうという傾向は出てくるんじゃないかと思います。そういうアプリはコメ見て判断するしかないですね。この辺はMarketの評価スキームがプアすぎるという話になるのでまた別。
 といっても「自前サービスの起動は処理中の最小限に留め、標準アラームサービスでキックしよう」という基本さえ押さえていればiPhoneより悪い事態にはならないかと。コネクションを張りっ放しにしなければならない場合を除いて、自前サービスを立ち上げっぱなしにして自力で待つのはあまり良くありません。アラームかわいいよアラーム。
(追記)
 ちなみに「行儀の悪いサービス」は自動終了からも逃れてしまうことが多いため、強制終了させるためにタスクマネージャを使う、というのは有りだと思います。
 (でも俺はそういうアプリはアンインストールしてしまうクチなので……)
 逆に考えてiPhoneは行儀の悪いサービスを登録されてしまった時にどうすんだろうという気もする。
■総括
 アプリ切り替えの部分(Activity)はバッテリ的なインパクトは(変な実装をしない限り)無いです。何でiPhoneが今までこれが出来なかったのかは良く分かりません。本気で分からん。
 バックグラウンド処理(Service/Multitasking)はバッテリ消費の増加が発生しえます。ですが、お行儀良く作ればインパクトは小さく抑えられます。お行儀悪く作ればそうでないアプリが出来ちゃうこともあります。この傾向はAndroidもiPhoneも同様と思われます。構造はほぼ変わらんと思われるので、同じことやれば同じように消耗するでしょう。

“Androidのマルチタスクの話をしてみる(2)” への7件の返信

  1. 記憶なんですが、iPhoneだと、ホームボタンが押されたときに、カレントアプリが終了する直前に、終了するというメッセージが通知されるので、アプリ側でレジューム情報を残してあげれば、”Activity”と同様のことができます。面倒くさいですが。

  2. Xperia を使っておられれば判ると思いますが、Sony 製のサービスがヒドイ作りでバッテリ消費がはげしいです(猛烈に intent-filter が仕込まれています)。
    それらを殺すためタスクマネージャが必須です。
    というのも、プリインストールアプリはアンインストールでないからです。
    このSony 製サービス群のせいで、齟齬・誤解がおきているんだと思います

  3. いや俺はXperiaユーザではないので何とも言いがたいですが
    いくら作りが悪くても動作中の標準サービスを殺すのって危険だと思いますが……。
    というかXperiaがintent-filterのせいで電池の持ちが悪い、というのは初耳です。
    intent-filterで電池の持ちが悪くなるというのは直感的には想像しがたいのですが
    その辺の話ってどこか情報ありますか?

  4. intent-filter かどうか知りませんが、Xperia の Timescape という標準インストールのアプリが、電話、twitter、メール、mixi、facebook などなどへのアクセスを全て監視しているんです。
    これを、timer でやっているのか、他の機構でやっているのかわかりませんが、この動作のせいでバッテリを大量に食います。
    標準のサービスといっても、他のアプリと同じレベルのものですので、殺しても大丈夫だと思います。
    僕は、AutoTaskKiller 系のアプリで、Timescape のサービスを殺しています。

  5. 実機の事情が分からないので何とも言えませんが
    プレインストールで作りの悪いサービスが入るので殺すしかない
    というのであればその使い方は否定するつもりはないです。
    ただあくまで直感的に原理的な部分だけ考えるならば、
    intent-filterに引っ掛かる場合は「既にCPUが起きている」時に走る処理なので
    よほど重い処理を引っ掛けない限りそんなに電池の消費が大きくなることはないんじゃないかと思います。
    特定条件でWakeLockを握りっぱなしになるようなバグとかあるのかも。
    まあ実機持ってないので何とも言えません。
    ただ俺がXperia開発チームだったら、そんなアプリ作られたら
    実機テストの時点でTimescapeチーム以外の全員が発狂すると思います。

  6. Timescapeで各種アカウント設定して自動取得するようにしていれば、頻繁に通信をするので電池消耗が早くなりますが、なんの設定もしなければTaskを殺す必要はありません。アンインストールも必要ありません。

pik へ返信する コメントをキャンセル

メールアドレスが公開されることはありません。 が付いている欄は必須項目です


The reCAPTCHA verification period has expired. Please reload the page.