13

次のシナリオを見てみましょう。

  1. アプリケーション クラス、アクティビティ、およびバックグラウンド サービスを備えた新しい Android アプリを作成しました。
  2. staticアプリケーション クラスにいくつかの変数があります。それが int i = 0; であるとしましょう。
  3. を開始し、アクティビティの からactivity開始すると、サービスはフラグを取得します。serviceonCreate()START_STICKY
  4. ここでservice行うことは、TimerTask を使用して現在の秒をアプリケーション クラスの変数に書き込むことだけです。5.活動を終了します
  5. しばらくすると、Android はサービスとアプリケーションを強制終了し (デバイスのリソースが不足しているとします)、START_STICKYフラグのためにサービスを再起動します。

今、私は質問する必要があります:

  1. OS がアプリケーションを kill するが、サービスを kill しない状況ですか?
  2. システムによってサービスが再起動されると、アプリケーションも再起動されますか? はいの場合 - どのようなコンテキストがあるのか​​、そうでない場合、彼のアプリケーションなしで実行されているサービスがあるのはどうしてでしょうか?

ありがとう、私のひどい英語でごめんなさい...

4

3 に答える 3

8

1. OS がアプリケーションを強制終了しても、サービスを強制終了しない状況はありますか?

tl;dr:はい、可能です。ただし、Service独自のプロセスで開始する必要があります。

説明:

Android OS は、メモリが不足しているときに、またはなどの個々のコンポーネントではなく、プロセスを強制終了することを理解することが重要です(この回答を参照してください)。ActivitiesServices

上記のステートメントを考えると、 a が別個のプロセスに含まれている場合にのみ、 aServiceが から独立して存在できることは明らかです。Applicationそうしないと、プロセスが破棄されるときに一緒に破棄されます。

ここで、ServiceApplicationが別々のプロセスに存在する場合を考えてみましょう。Android では、メモリ不足の状況では、優先度の低いプロセスから高いプロセスへとプロセスが破棄されます。優先順位は、Empty < Background < Service < Visible < Foreground (こちらを参照) です。したがって、アプリケーションがバックグラウンドにある場合など、生きている間に意志が破壊される可能性があり、アプリケーションが生きている間 (アプリケーションがフォアグラウンドにある場合) に意志が破壊される可能性もありApplicationます。ServiceService

android:processコンポーネントのマニフェスト タグで属性を定義することにより、アプリケーションの任意のコンポーネント (Activity、Service、ContentProvider など) を独自のプロセスで実行するように宣言できます。

Processesの公式ドキュメントから:

デフォルトでは、同じアプリケーションのすべてのコンポーネントが同じプロセスで実行され、ほとんどのアプリケーションはこれを変更しないでください。ただし、[...] コンポーネント要素の各タイプ ( ActivityServiceReceiver、および) のマニフェスト エントリは、そのコンポーネントを実行するプロセスを指定できる属性をProviderサポートしています。android:processこの属性を設定して、各コンポーネントが独自のプロセスで実行されるようにするか、一部のコンポーネントがプロセスを共有し、他のコンポーネントが共有しないようにすることができます。[...]このApplication要素は、すべてのコンポーネントに適用されるデフォルト値を設定するために、android:process 属性もサポートしています。


2. システムによってサービスが再起動されると、アプリケーションも再起動されますか?

これは、質問 1 の回答に関連しています。

Serviceが と同じプロセスに存在する場合、Applicationそれらは両方とも破棄され、一緒に再起動されます。

Serviceが のように別のプロセスに存在する場合、Applicationそれらは完全に別のプロセスであるため、Android OS が適切と見なすように、互いに独立して破棄および再起動されます。

于 2015-07-10T20:48:13.193 に答える
1

Tomer Mor の答えは正しくありません。

あなたApplicationが死ぬとき - あなたServiceも死ぬ。

あなたServiceの は、あなたの の後にのみ作成されますApplication。これは、ログに記録することで自分自身を観察できますonCreate()

于 2013-03-13T09:06:12.760 に答える
1

OS がアプリケーションを強制終了するが、サービスを強制終了しない状況はありますか?

はい、そのような状況があります。一般に、サービスはシステムから最後のリソースを要求するため、アクティビティの後に終了します。ここでドキュメントを読んでください。

システムによってサービスが再起動されると、アプリケーションも再起動されますか?

それについてはよくわかりませんが、サービスはアプリケーション参照なしで存続できるため、いいえだと思います

于 2013-03-07T09:53:59.720 に答える