AppNext Press 

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

スポンサーサイト

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

PageTop

Serviceの自動起動

今回はServiceの自動起動についてのポイントです。


端末を起動した時にServiceを自動起動させるように実装させるにはBroadcastRecieverを使ってBOOT_COMPLETEDを受けてServiceを起動させればよいだけなので簡単に実装できます。

参考サイト:「kino's blog」


ですが! 

実際に実機で試してみたところ、全く動作してくれませんでした・・・


なぜか?

原因は意外(?)なところにありました。
それはアプリのインストール先でした。

どうやらアプリをSDカードなど外部メモリに保存すると動作しないようです。
試しにアプリをスマホ本体に保存したところ正しく動作してくれました。

参考サイト:「team-hiroq」


すべての機種やandroid OSのヴァージョンにおいてそうなのかは確認していませんが、この実装をする場合にはどうやらアプリのインストール先を本体にした方が良さそうですね。


ただSDカードへの保存ってすごくユーザーのニーズが高いんですよね。。。
使い勝手の良さを取るか、SDカードへの保存を取るかは結局のところユーザーに任せるしかないということになりそうです。


ちなみに今回紹介した実装は、『スマートバッテリー』ver3.5でアップデートしました。
参考までに!




スポンサーサイト

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ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。