AppNext Press 

アンドロイドアプリ開発をしているAppNextによるAndroidアプリ開発・リリース情報をお届けします。 ツイッターもやっています。ぜひフォローしてください♪ 【@AppNextJP】

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

PageTop

Serviceとprocess

自分用にちょっとだけメモっておきます。

Serviceを使って常駐アプリを作るときの注意点。


Serviceにはローカルとリモートがある。
ローカルは単一のプロセスで、リモートは複数のプロセスに分離する。


例えば、アクティビティとサービスで構成されたアプリを作るとする。


ローカルサービスだとアクティビティとサービス両方の処理を同じ1つのプロセスで処理する。結果として当然のことながらそのプロセスにかかる負担は重くなってしまう。


それに対してリモートサービスだとアクティビティはアクティビティとしてのプロセス、サービスはサービスとしてのプロセスとして分離して処理する。そのためそれぞれのプロセスにかかる負担は分離されて軽くなる。



リモートでなはく、ローカルサービスとして実装した場合どんなことが起こるか?
「実行中のサービス」一覧でそれが確認できる。
該当するサービスのメモリ容量を見ると、かなり大きくなってしまう。『スマートバッテリー』では10MB前後あった。
さらに悪いことには、サービスを起動し直したり、またアクティビティを起動したりすると、みるみるメモリ容量は膨らんでいく。その数値は20MB以上になることも確認できた。
なおかつ、画面消灯するとサービスが進行していないという不思議な(?)現象も起きるようだ。


以上の問題はリモートサービスとして実装し直すことで解決できた。
やり方としてはマニフェストのサービスタグに「android:process=":remote"」を付けるだけ。もしかしたらまだ詳細なやり方があるかもしれないが現在のところはこれで意図したとおりの動作になったのでよしとしよう。
ちなみにリモートにすると、「実行中のサービス」の「プロセス」名の右端に「:remote」と表示される。


「android:process」属性はサービスだけではなく、ブロードキャストレシーバなど他の基本コンポーネントでも使用できる。

以上、参考までに。


※追記

リモートサービスを使うとプロセスは分離される。サービスのプロセスだけを生かして別のプロセスは不要だという場合はさらに別途処理が必要なようだ。

というのも、例えばアクティビティとサービスとで構成されるアプリの場合、アクティビティのプロセスが無駄にメモリや電池を消費しているからだ。
プロセスの終了は基本的にアンドロイドOSが自動でkillしてくれるらしいのだが、なかなかkillしてくれないので、意図的に実装する必要がある。

やり方はプロセスをkillしたい箇所で「android.os.Process.killProcess(android.os.Process.myPid());」を呼び出すだけだ。


参考サイト:「KamoLand」


スポンサーサイト

PageTop

コメント


管理者にだけ表示を許可する
 

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。