5

アンドロイド初心者です...

クラスに直面しなければならない最大の時間は、context時々私を混乱させます。ある場所では を使用し、ある場所でcontextは によって呼び出され ます。getApplicationContext()getContext()getBaseContext()

このサイトhttp://www.developer.android.com/からそれについて理解しようとしました が、理解するのは困難でした。

4

1 に答える 1

2

Androidでは、コンテキストは多くの操作に使用されますが、主にリソースの読み込みとアクセスに使用されます。これが、すべてのウィジェットがコンストラクターでContextパラメーターを受け取る理由です。通常のAndroidアプリケーションでは、通常、アクティビティとアプリケーションの2種類のコンテキストがあります。これは通常、開発者がコンテキストを必要とするクラスとメソッドに渡す最初のものです。

getApplicationContext()、getContext()、getBaseContext()、またはthis(アクティビティクラスの場合)を呼び出すことで、コンテキストを取得できます。

コンテキストの一般的な使用法:

  1. 新しいオブジェクトの作成:新しいビュー、アダプター、リスナーの作成:

    TextView tv = new TextView(getContext()); ListAdapterアダプター=newSimpleCursorAdapter(getApplicationContext()、...);

  2. 標準の共通リソースへのアクセス:LAYOUT_INFLATER_SERVICE、SharedPreferencesなどのサービス:

    context.getSystemService(LAYOUT_INFLATER_SERVICE)
    getApplicationContext()。getSharedPreferences(namemode);

  3. コンポーネントへの暗黙的なアクセス:コンテンツプロバイダー、ブロードキャスト、インテントに関して

    getApplicationContext()。getContentResolver()。query(uri、...);

コンテキストを維持するとメモリリークが発生する可能性があるため、コンテキストを使用する場合は注意が必要です。

要約すると、コンテキスト関連のメモリリークを回避するために、次の点に注意してください。

  1. コンテキストアクティビティへの長期的な参照を保持しないでください(アクティビティへの参照は、アクティビティ自体と同じライフサイクルを持つ必要があります)
  2. コンテキストアクティビティの代わりにコンテキストアプリケーションを使用してみてください
  3. ライフサイクルを制御しない場合は、アクティビティ内の非静的内部クラスを避け、静的内部クラスを使用して、内部のアクティビティを弱参照します。この問題の解決策は、たとえばViewRootとそのW内部クラスで行われるように、外部クラスへのWeakReferenceを持つ静的内部クラスを使用することです。
  4. ガベージコレクターは、メモリリークに対する保険ではありません
于 2012-05-08T11:25:02.773 に答える