Context?


1.Contextの定義


  • アプリケーション環境のグローバル情報にアクセスするためのインタフェース.

  • Contextを使用すると、アプリケーション固有のリソースまたはクラスにアクセスできます.

  • APIを呼び出して、アクティビティの実行、Intentのアナウンス、およびIntentの受信などのアプリケーション・レベルのタスクを実行できます.

  • Androidシステムが提供するAPIを呼び出す機能を提供します.
  • 2.アンドロイドアプリケーション情報管理主体


  • アンドロイドシステム上でアプリケーション情報を管理するのは、「ActivityManagerService」と呼ばれる別のアプリケーションです.

  • Androidでアプリケーション関連情報にアクセスする場合は、Activity Managementサービスを利用する必要があります.
  • 3.contextのキャラクター


  • 担当するアプリケーションを示す役割

  • Activity Managementサービスにアクセスするためのチャネルロール
  • 4.Contextのタイプ


  • アプリケーションコンテキスト-アプリケーションのライフサイクルに関連する単一のトーン

  • アクティビティContext-アクティビティライフサイクルに関連-アクティビティごとに作成

  • アプリケーションコンテキストは、アプリケーションが実行されて終了するまで同じオブジェクトです.
    onDestory()で消えるオブジェクト.
  • 5.Contextの作成時期


  • アクティビティまたはサービスの作成時にContextが作成されます.

  • BroadcastReceiver呼び出し時にもContextが作成されます.

  • この2つのContextは異なるインスタンスです.
  • 6.Contextにアクセスする具体的な方法


    View.getContext()

  • は、現在のビューが持つコンテキストを返し、通常はActivityでビューを空にしているため、ActivityのContextとなる.
  • Activity.getApplicationContext()


  • アプリケーション全体のコンテキストを返します.

  • 現在のアクティビティとアプリケーションのライフサイクルに関連するコンテキストが必要な場合は、Activity Contextではなくこの値を使用できます.

  • getApplicationContext()はアプリケーションのライフサイクルに関連付けられているため、現在のContextから分離された任意のContext、または現在のアクティビティの範囲外で操作する必要があります.

  • 7.ApplicationContext()を誤って使用


  • Application ContextはActivityのすべてをサポートしていません.

  • ほとんどのアプリケーションコンテキストではGUI(画面、ビューなど)は使用できません.

  • 活動するしかない.

  • たとえば、Application Contextを使用してAlertDialogを表示する場合は、次のエラーが発生する可能性があります.

  • java.lang.IllegalStateException: You need to use a Theme.AppCompat theme (or descendant) with this activity.

  • ただし、ToastがApplication Contextを使用しても問題ありません

  • Toastでは、特定のアクティビティに関連付けられたウィンドウではなく、独自のウィンドウを作成するためです.
  • 8.プロセスがなくてもAndroidアプリケーションは正常に動作します。


  • Androidプラットフォームでは、プロセスがなくてもアプリケーションが生きているようにユーザーに表示され、メモリが不足している場合は、実行中のプロセスを強制的に終了し、そのプロセスで実行されているアプリケーションに関する情報を個別に管理します.その後、メモリ容量があれば、記憶されているアプリケーション情報に基づいて新しいプロセスを開始するなど、不思議なことが起こります.

  • Androidシステムでは、プロセスはもちろんオペレーティングシステムカーネル(Linux)によって管理されます.アプリケーションとプロセスが別々に管理されている場合、アプリケーション情報はどこで管理されますか?アクティブ管理サービスはAndroidシステムサービスの一つです.では、ActivityManagerServiceはどのようにアプリケーションを管理しているのでしょうか.それ以外はとても簡単です.特定のトークンをキー値とするKey Valueのアレイを使用して、現在実行中のアプリケーション情報を管理します.

  • ほとんど結論が違うContextは、アプリケーションに関連する情報にアクセスしたり、アプリケーションに関連するシステムレベルの関数を呼び出したりするために使用されます.アンドロイドシステム上でアプリケーション情報を管理するのは、システムではなくActivity Management Serviceという別のアプリケーションです.したがって、一般的なプラットフォームとは異なり、Androidがアプリケーションに関する情報にアクセスする必要がある場合は、ActivityManagerServiceを利用する必要があります.もちろん、情報を取得するアプリケーションに関連するキー値も必要です.

  • 一般的なオペレーティングシステムプラットフォームでは、アプリケーションがプロセスです.アプリケーションがオペレーティングシステムに私がどのようなプロセスなのかだけを教える場合は、アプリケーションに関連する情報を取得できます.ただし、Androidではアプリケーションをプロセスと呼ぶことはできません.ActivatyManagerServiceがアプリケーションを管理しているため、これはプロセスです.

  • Contextは、アプリケーションの起動時に生成されるだけでなく、アプリケーションコンポーネントを作成するたびに生成されます.

  • Android管理アプリケーションの鍵は、プロセスを秩序正しく閉じることができないことです.ユーザーがアプリケーションを離れると、アプリケーションのプロセスは変更されず、バックグラウンドで必要な操作(Webページのダウンロードなど)を実行できます.その後、ユーザーがアプリケーションに戻ると、すぐにバックグラウンドに切り替えられます.デバイスに十分なメモリがある場合、アンドロイドはすべてのアプリケーションプロセスを保持します.つまり、すべてのアプリケーションが同時に実行できます.

  • メモリは無限ではありません.これらの制限を克服するために、アンドロイドシステムは不要なプロセスを終了しなければならない.これは、各プロセスの重要性がルールに依存し、最も重要でないプロセスが終了することを意味します.これらのプロシージャは、Androidのプロセスライフサイクル(Process Lifecycle)を作成します.

  • 「すべてのアプリケーションが実行されている」というユーザー体験の要件を満たすために、ユーザーが閉じたアプリケーションに戻る場合は、アプリケーションを最後のアプリケーションと同じ方法で起動する必要があります.このため、ユーザーが表示するアプリケーション要素(すなわち、アクティビティ)は常に記録され、必要に応じて画面に表示されるステータス情報を使用してアクティビティが再起動されます.アクティブなステータス情報は、アプリケーションが終了したときに生成されるのではなく、ユーザがアプリケーションを離れたときに生成されるので、カーネルは、ユーザがアプリケーションを離れた後、比較的自由にアプリケーションを終了することができる.

  • ある意味では、アンドロイドがプロセスを管理する方法は、「スワップスペース」(swappace)のフォーマットと見なされる可能性があります.アプリケーション・プロセスは、使用中のメモリ領域を表します.メモリが不足すると、一部のプロセスは強制的に終了し(SWAPED OUTに置き換え)、これらのプロセスが再起動する必要がある場合は、前回保存したステータス情報に基づいて再起動することができます(SWAPED INを投入することに置き換えます).
  • 9.サンプルコード

    package com.cos.contextex01;
    
    import androidx.appcompat.app.AlertDialog;
    import androidx.appcompat.app.AppCompatActivity;
    
    import android.content.Context;
    import android.os.Bundle;
    import android.view.View;
    import android.widget.Button;
    import android.widget.Toast;
    
    public class MainActivity extends AppCompatActivity {
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
    
            Button button = findViewById(R.id.button);
            button.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    Context c1 = v.getContext();
                    Context c2 = MainActivity.this;
                    Context c3 = getApplicationContext();
    
                    AlertDialog.Builder builder = new AlertDialog.Builder(c1);
                    builder.setTitle("인사말").setMessage("반갑습니다");
                    AlertDialog alertDialog = builder.create();
                    alertDialog.show();
    
                    Toast.makeText(c3, "안녕", Toast.LENGTH_SHORT).show();
                }
            });
        }
    }