これに対する満足のいく答えが見つからなかったため、ここで質問します。Activity/Service.getApplication()
との関係は何でしょうかContext.getApplicationContext()
?
私たちのアプリケーションでは、どちらも同じオブジェクトを返します。ただしActivityTestCase
、アプリケーションをモックすると、getApplication()
モックが返されますが、getApplicationContext
異なるコンテキスト インスタンス (Android によって挿入されたもの) が返されます。これはバグですか? 意図的ですか?
そもそも違いがわかりません。テスト スイートの外部で、両方の呼び出しが異なるオブジェクトを返すケースはありますか? それはいつ、なぜですか? さらに、 はなぜ とgetApplication
では定義されていActivity
てService
、 では定義されていないのですか?どこContext
からでも有効なアプリケーション インスタンスを常に利用できるようにすべきではないですか?
ベストアンサー1
非常に興味深い質問です。これは主に意味論的な意味だと思いますが、歴史的な理由もあるかもしれません。
現在の Android Activity および Service 実装では同じオブジェクトが返されますgetApplication()
がgetApplicationContext()
、常にそうなるという保証はありません (たとえば、特定のベンダー実装の場合)。
したがって、マニフェストに登録した Application クラスが必要な場合は、それを呼び出してアプリケーションにキャストしないgetApplicationContext()
でください。これは、それがアプリケーション インスタンスではない可能性があるためです (これは、テスト フレームワークで明らかに経験したことです)。
getApplicationContext()
そもそも はなぜ存在するのでしょうか?
getApplication()
は Activity クラスと Service クラスでのみ使用できますが、 はgetApplicationContext()
Context クラスで宣言されています。
これは実際には 1 つのことを意味します。つまり、コンテキストではないが onReceive メソッドでコンテキストが与えられるブロードキャスト レシーバーでコードを記述する場合、 のみを呼び出すことができますgetApplicationContext()
。これは、BroadcastReceiver でアプリケーションにアクセスできるとは限らないことも意味します。
Android コードを見ると、アクティビティがアタッチされると、ベース コンテキストとアプリケーションを受け取り、それらが異なるパラメーターであることがわかります。 は、getApplicationContext()
その呼び出しを に委任しますbaseContext.getApplicationContext()
。
もう 1 つ: ドキュメントには、ほとんどの場合、Application をサブクラス化する必要はないと書かれています。
通常、 をサブクラス化する必要はありません
Application
。ほとんどの場合、静的シングルトンは、よりモジュール化された方法で同じ機能を提供できます。シングルトンにグローバル コンテキストが必要な場合 (たとえば、ブロードキャスト レシーバーを登録するため)、それを取得する関数に、シングルトンを最初に構築するときにContext
内部的に使用される を指定できますContext.getApplicationContext()
。
これは正確で正確な答えではないことは承知していますが、それでもあなたの質問への答えになっていますか?