Android contextとgetApplicationContext()

1594 ワード

通常のAndroidアプリケーションでは、Context、Activity(Active Context this)、およびApplication(アプリケーションContext:Activity.getApplicationContext()の2種類があります.
基本的には、アプリケーションContextはアプリケーションに関連付けられており、プログラムのライフサイクル内では常に同じです.ただし,アクティビティContextはあるアクティビティに関連付けられており,Activityの破棄(縦横画面切り替えなど)に伴い,このContextもN回以上破棄される.
context :
文でAlertDialog.Builder builder = new AlertDialog.Builder(this); では、伝達を要求するパラメータはcontextで、ここで私たちが伝えたのはthisですが、このthisはいったい何を指しているのでしょうか.ここのthisはActivity.thisは、この文が存在するActivityのthisで、このActivityのコンテキストです.
ネット上には多くの友达がここでthisに伝わっています.getApplicationContext()は間違っています.AlertDialogオブジェクトは1つのViewに依存し、Viewは1つのActivityに対応します.そこで、ここではライフサイクルの問題について説明します.getApplicationContext()は、このアプリケーションのContext,Activity.thisはこのActivityのContextを取り、この2つのライフサイクルは異なり、前者のライフサイクルはアプリケーション全体であり、後者のライフサイクルはその存在するActivityにすぎない.AlertDialogはActivityに属しているはずで、Activityが破棄されたときに破棄され、二度と存在しません.しかし、この.getApplicationContext()は、そのライフサイクルがアプリケーション全体であることを示しており、これは明らかにそのライフサイクルを超えています.だから、ここではActivityのthisしか使えません.
new AlertDialog.Builder(getApplicationContext())     :
E/AndroidRuntime(5844): android.view.WindowManager$BadTokenException: Unable to add window -- token null is not for an application

  Activity.thisはactivityを返しますが、getApplicationContext()はActivityを返すとは限りません.
getApplicationContext()はアプリケーションのコンテキストを返し、ライフサイクルはアプリケーション全体であり、アプリケーションはそれを破壊してActivityを破壊する.このcontextは現在のActivityのコンテキストを返し、Activityに属し、Activityが破壊すると破壊されます.
ライフサイクルを明らかにすれば、使用中に間違いを犯すことはない.たとえば、ACtivityではなくgetApplicationContextを使用するグローバルなデータ操作クラスがあります.これにより、データベースの操作はactivityとは無関係であることが保証されます.