ライフサイクル - android serviceconnection



Androidアプリケーションクラスが2回呼び出されています (2)

私のAndroidアプリケーションでは、Applicationクラスをオーバーロードし、マニフェストのタグを更新しました。 このアプリケーションはAndroidサービスも作成します。 私は自分のApplicationクラスのonCreateにいくつかのログを入れました、そして私はそれが二度呼ばれているのを見ます。 最初の時間は私のアプリケーションが起動されたときです(これは予想されています)。そして、それは通常、サービスが作成された直後です。 ログには、アプリケーションの2番目のインスタンスが作成されていることも示されています。 (私は "this"の値を表示しましたが、それらは異なります)。

アプリケーションはシングルトンとして作成されると思いました。 私がサービスを作成したのはそれが起こっているのでしょうか?


Answer #1

はい、android:processを使用した場合は、別のプロセスで実行しているため、サービスが開始されるとそのプロセスに対して新しいプロセスが開始されるため、そのプロセスの新しいApplicationオブジェクトを作成する必要があります。

しかし、もっと根本的な問題があります。Applicationオブジェクトがそのサービスの1つを起動するのは正しくありません。 アプリケーションを他のOSの「アプリケーション」とどのように考えるかを混同しないようにすることが重要です。 Applicationオブジェクトはアプリを駆動しません。 これは、そのプロセスにおけるアプリの単なるグローバル状態です。 実際には、Applicationオブジェクトは完全に不必要です - あなた Androidアプリケーションを書くためにそれを必要としません 。 一般的に私は実際に人々がそれを使用しないことをお勧めします。 何よりもトラブルを引き起こす可能性が高いです。

別の言い方をすれば、アプリケーションを実際に定義しているのは、アクティビティ、サービス、レシーバー、およびプロバイダーのタグのコレクションです。 それらが「立ち上げ」られているものです。 すべてのアプリケーションは、アプリケーションのプロセスを初期化することの一部として作成されるものです。 それ自身のライフサイクルはありません。アプリ内の他の実際のコンポーネントにサービスを提供するためだけのものです。

そのため、アプリを設計するときはApplicationを無視してください。 混乱を軽減します。 (代わりに、私はそのような状態にグローバルシングルトンを使用することを好みます。)

また、原則としてandroid:processを使用しないことをお勧めします。 用途は確かにいくつかありますが、それが必要とされない時間の大部分は、アプリケーションがより多くのRAMを使用し、効率が悪く、書き込みが困難になります(単一プロセスでグローバルを利用できないため)。 。 あなたがandroid:を使用するのに正当な理由が実際にある場所に到達すればそれはあなたにとって明白であるべきです:プロセス。


Answer #2

問題は、サービスも独自のライフサイクルを持つコンポーネントであり、ユーザーインターフェイスがないことです。 代替案については、 開発者向けアプリケーションの基本事項を確認してください。





android