通常の状況では、ダイアログの作成はアクティビティのコンテキストで渡される必要があります。それ以外の場合は、次のエラーが報告されます:トークン null が無効です。アクティビティは実行されていますか?
なぜそうなるのかというと、ダイアログはウィンドウであるため、ウィンドウである場合には、システムの WMS の連携と管理に準拠する必要があります。
窓の種類
ウィンドウには、アプリケーション ウィンドウ、システム エラー ウィンドウ、インプット メソッド ウィンドウ、ポップウィンドウ、トースト、ダイアログなど、さまざまな種類があります。一般的に、Window は 3 つの主要なタイプに分類されます。
- アプリケーション ウィンドウ: 値は FIRST_APPLICATION_WINDOW と LAST_APPLICATION_WINDOW の間です。は通常のトップレベルのアプリケーション ウィンドウであり、トークンはアクティビティ トークンに設定する必要があります。
- サブウィンドウ: 値は FIRST_SUB_WINDOW と LAST_SUB_WINDOW の間です。トップレベル ウィンドウに関連付けられているトークンは、それが接続されているホスト ウィンドウのトークンに設定する必要があります。
- システム ウィンドウ: 値は FIRST_SYSTEM_WINDOW と LAST_SYSTEM_WINDOW の間です。特定のシステム機能に使用されます。アプリケーションでは使用できず、使用するには特別な権限が必要です。
それぞれの大きな型には多くの型が含まれており、それらはすべて WindowManager の静的内部クラス LayoutParams で定義されています。
アプリケーションウィンドウ
アプリケーション ウィンドウは、特定のアプリケーション内に存在するウィンドウであり、全画面ウィンドウまたは通常のウィンドウにすることができます。アプリケーション ウィンドウのタイプは、WindowManager クラスの定数値によって定義され、その Type 値の範囲は 1 ~ 99 で、ウィンドウ レベルを表します。アプリケーション ウィンドウはアプリケーション内のさまざまなアクティビティに対応し、追加、削除、変更などの操作を実行できます。
例えば:
TYPE_APPLICATION: 画面全体を占めるアプリケーション ウィンドウ。
TYPE_APPLICATION_PANEL: アプリケーション パネル ウィンドウ。アプリケーション ウィンドウの上にありますが、覆うことができます。
TYPE_APPLICATION_ATTACHED_DIALOG: アプリケーションはダイアログ ウィンドウをアタッチします。これは親アクティビティに関連付けられており、アクティビティが消えると自動的に消えます。
TYPE_APPLICATION_MEDIA: ビデオとオーディオを再生するためのアプリケーション メディア ウィンドウ。
子ウィンドウ
子ウィンドウは、親ウィンドウに付属しており、独立していないウィンドウです。子ウィンドウのタイプも WindowManager クラスの定数値によって定義され、その Type 値の範囲は 1000 ~ 1999 です。子ウィンドウはアプリケーション ウィンドウに基づいて構築されます。つまり、子ウィンドウはアプリケーション ウィンドウにアタッチされる必要がありますが、WindowManager.LayoutParams クラスの関連パラメーター (親、トークン パラメーターなど) レベルを通じて独自のウィンドウを変更して、ポップアップエフェクト。
例えば:
TYPE_APPLICATION_SUB_PANEL: アプリケーションのサブパネル ウィンドウ。
TYPE_APPLICATION_TOP_MOST: アプリケーションの最上部のウィンドウ。
TYPE_SYSTEM_ALERT: システム警告ウィンドウ。バッテリー低下警告などのシステムレベルの警告情報が表示されます。
TYPE_TOAST: 短いメッセージを表示するためのプロンプト ウィンドウ。
システムウィンドウ
システム ウィンドウはシステム レベルのウィンドウで、通常はトースト、インプット メソッド ウィンドウ、システム ボリューム バー ウィンドウなどのシステム レベルの情報やダイアログ ボックスを表示するために使用されます。これらはすべて、比較的高い優先順位と権限を持つシステムレベルのアプリケーションです。システム ウィンドウのタイプも WindowManager クラスの定数値によって定義され、その Type 値の範囲は 2000 ~ 2999 です。システム ウィンドウは、アプリケーション ウィンドウや子ウィンドウに比べて最上位にあるため、アプリケーションのアクティブ ウィンドウが表示されている場合でも、常に画面の上部に表示されます。
例えば:
TYPE_STATUS_BAR: ステータス バー ウィンドウ。時間、電源などのシステム ステータスを表示します。
TYPE_NAVIGATION_BAR: ナビゲーション バー ウィンドウは、画面ナビゲーションを制御するために使用されるシステム レベルのウィンドウです。
TYPE_INPUT_METHOD: ユーザーが入力したテキストを表示する入力方法ウィンドウ。
TYPE_SYSTEM_OVERLAY: システム オーバーレイ ウィンドウ。他のすべてのウィンドウの上に配置できます。
非アクティビティオブジェクトでダイアログを通常に作成して表示します
通常、作成するダイアログはすべてサブウィンドウです。サブウィンドウはアプリケーション ウィンドウに依存するため、アクティビティコンテキスト context で渡されます。
サービスでダイアログをポップアップする必要がある場合は、システム ウィンドウを作成できます。
- SYSTEM_ALERT_WINDOW 権限を申請する必要があります
- Dialog.show メソッドを呼び出す前に、ダイアログ ウィンドウのタイプを TYPE_SYSTEM_ALERT や TYPE_APPLICATION_OVERLAY などの SYSTEM_WINDOW タイプとして指定する必要があります。
————————————————
参考链接:
https://blog.csdn.net/qq_43358469/article/details/131121966