getApplication() と getApplicationContext() の違い 質問する

getApplication() と getApplicationContext() の違い 質問する

これに対する満足のいく答えが見つからなかったため、ここで質問します。Activity/Service.getApplication()との関係は何でしょうかContext.getApplicationContext()?

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

そもそも違いがわかりません。テスト スイートの外部で、両方の呼び出しが異なるオブジェクトを返すケースはありますか? それはいつ、なぜですか? さらに、 はなぜ とgetApplicationでは定義されていActivityService、 では定義されていないのですか?どこ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()

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

おすすめ記事