6

Jelly Bean 4.1.1 (公式) を搭載した私の Galaxy Nexus では、OS が異常終了し、ログに次のようなエントリが記録されることがあります。

10-02 22:24:34.992 I/ActivityManager(  306): Killing 7517:com.google.android.apps.reader/u0a77: remove task
10-02 22:24:36.484 I/ActivityManager(  306): Killing 7465:com.tf.thinkdroid.sg:writedroid/u0a50: remove task
10-02 22:24:37.273 I/ActivityManager(  306): Killing 5924:com.metago.astro/u0a73: remove task
10-02 22:24:37.296 W/ActivityManager(  306): Scheduling restart of crashed service com.metago.astro/.jobs.JobService in 5000ms
10-02 22:24:37.656 I/ActivityManager(  306): Killing 7302:org.jtb.alogcat/u0a84: remove task
10-02 22:24:38.148 I/ActivityManager(  306): Killing 7120:com.google.android.gm/u0a19: remove task

残念ながら、強制終了されたプロセスの 1 つは、実行中のアプリがバインドされているリモート サービスです。実際、サービスは直後に再起動されますが、これによりアプリで一貫性のない動作が発生します。

サービスライフサイクルでは、次のように述べています。

サービスは、開始することも、接続をバインドすることもできます。このような場合、サービスが開始されているか、Context.BIND_AUTO_CREATE フラグを使用してサービスへの接続が 1 つ以上ある限り、システムはサービスを実行し続けます。

私のアプリはリモート サービスにバインドされてContext.BIND_AUTO_CREATEいるため、メイン プロセスがバインドされている限り、リモート サービスは稼働し続けるという印象を受けました。Androidがリモートサービスを強制終了しないようにするにはどうすればよいですか?

注: 報奨金は、ドキュメントに従ってコードが機能しないように見える理由を説明するためのものです。

4

3 に答える 3

4

サービスは、プロセスで実行されるアプリケーションのコンポーネントです。ただし、サービスライフサイクルのドキュメントによると、サービスを含むプロセスは強制終了されるべきではありませんでしたが、Androidが強制終了される場合もあります。

OSにリソース不足がある場合、実行中のプロセスに優先順位を付け、優先順位の低いプロセスを強制終了します。現在、サービスのライフサイクルに従って強制終了されないことが約束されているサービスを実行しているプロセスが複数ある場合、Androidは優先順位を下げて、優先度の低いプロセスを強制終了します。

Androidは、メモリが少なく、ユーザーによりすぐにサービスを提供している他のプロセスによって必要とされるときに、ある時点でプロセスをシャットダウンすることを決定する場合があります。強制終了されたプロセスで実行されているアプリケーションコンポーネントは、結果的に破棄されます。それらのコンポーネントが実行する作業が再びある場合、それらのコンポーネントのプロセスが再開されます。

強制終了するプロセスを決定するとき、Androidシステムはユーザーにとっての相対的な重要性を評価します。たとえば、表示されているアクティビティをホストしているプロセスと比較して、画面に表示されなくなったアクティビティをホストしているプロセスをより簡単にシャットダウンします。したがって、プロセスを終了するかどうかの決定は、そのプロセスで実行されているコンポーネントの状態によって異なります。

ここから引用:http://developer.android.com/guide/components/processes-and-threads.html

OSのリソースが不足している場合、公正な約束を破る決定を下さざるを得ません:)

于 2012-10-08T11:51:27.337 に答える
4

ここで Joel F からのこの回答を読んでください: How it is possible Service run inlimitedly and also allow binding in android?

前述のように、本当にリソースが必要な場合、サービスを殺せない状態に保つ唯一の方法は、フォアグラウンド サービスhttp://developer.android.com/guide/components/services.html#Foregroundを使用することです。

「サービスが開始されているか、1 つ以上の接続がある限り、システムはサービスを実行し続ける」という引用が 100% の場合に当てはまらないため、ドキュメントも間違って書かれています。Context.BIND_AUTO_CREATE フラグはサービスにより高い権限を与えますが、サービスを強制終了できないほど高くはありません。他のサービスが最初に強制終了され、まだリソースが必要な場合は、特権サービスも強制終了されます。

于 2012-10-08T11:43:01.410 に答える
1

サービスをキル不可に設定するには、Android 永続サービスを参照してください: http://devescape.blogspot.ch/2011/02/persistent-services-in-android.html

于 2012-10-04T08:06:15.740 に答える