1. ホーム
  2. android

[解決済み] getApplication() vs. getApplicationContext()

2022-03-22 08:56:32

質問

これに対する満足のいく答えが見つからなかったので、ここで紹介します。 Activity/Service.getApplication()Context.getApplicationContext() ?

このアプリケーションでは、どちらも同じオブジェクトを返します。このアプリケーションでは ActivityTestCase しかし、アプリケーションをモック化することで getApplication() はモックで戻ってくるが getApplicationContext はまだ別のコンテキストインスタンス (Android によって注入されたもの) を返します。これはバグなのでしょうか?意図的なものでしょうか?

そもそも、その違いもよくわからない。テスト・スイートの外で、両方の呼び出しが異なるオブジェクトで戻ってくる場合があるのでしょうか?いつ、なぜ?さらに、なぜ getApplication に定義されている ActivityService にはありませんが Context ? からは常に有効なアプリケーションインスタンスが利用可能であるべきではないでしょうか? どこでも ?

解決方法は?

非常に興味深い質問です。主に意味的なものだと思いますが、歴史的な理由によるものもあるかもしれません。

現在のAndroid ActivityとServiceの実装ではありますが。 getApplication()getApplicationContext() は同じオブジェクトを返しますが、常にそうであるという保証はありません (たとえば、特定のベンダーの実装の場合など)。

そのため、マニフェストに登録したApplicationクラスが欲しい場合、以下のようになります。 決して コール getApplicationContext() というのも、アプリケーションのインスタンスではない可能性があるからです (これは明らかにテストフレームワークで経験したことです)。

なぜ getApplicationContext() はそもそも存在するのでしょうか?

getApplication() はActivityクラスとServiceクラスでしか利用できないのに対して getApplicationContext() はContextクラスで宣言されています。

コンテキストではないものの、onReceive メソッドでコンテキストを与えられているブロードキャストレシーバでコードを書くとき、このメソッドで呼び出せるのは getApplicationContext() . これは、BroadcastReceiverで自分のアプリケーションにアクセスできることが保証されていないことも意味します。

Androidのコードを見ると、アタッチされたとき、アクティビティはベースコンテキストとアプリケーションを受け取り、それらは異なるパラメータであることがわかります。 getApplicationContext() への呼び出しを委ねる。 baseContext.getApplicationContext() .

もうひとつ、ドキュメントによると、ほとんどの場合、Applicationのサブクラスは必要ないそうです。

<ブロッククオート

をサブクラス化する必要はありません。 Application . ほとんどの場合 静的シングルトンは、同じ機能をよりモジュール化して提供することができます。 の方法で行います。シングルトンにグローバルなコンテキストが必要な場合(たとえば ブロードキャストレシーバー)を取得するための関数を Context を使用し、内部的には Context.getApplicationContext() というのは を最初に構築します。

正確な答えになっていないことは承知していますが、それでも質問の答えになっていますか?