Android 서비스 등 비활동 상태에서 Dialog를 생성하는 방법

일반적인 상황에서 대화 상자 생성은 활동의 컨텍스트에서 전달되어야 합니다. 그렇지 않으면 오류가 보고됩니다:토큰 null이 유효하지 않습니다. 활동이 실행 중입니까?

왜 그럴까요?대화상자는 창이며, 창이라면 시스템 WMS의 조정 및 관리를 준수해야 합니다.

창 유형

윈도우의 종류는 응용프로그램 창, 시스템 오류 창, 입력기 창, PopWindow, Toast, Dialog 등 다양합니다. 일반적으로 Window는 세 가지 주요 유형으로 구분됩니다.

  • 응용 프로그램 창: 값은 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 클래스의 상수 값으로 정의되며 해당 유형 값의 범위는 1000~1999입니다. 즉, 하위 창은 응용 프로그램 창에 연결되어야 하지만 WindowManager.LayoutParams 클래스의 관련 매개 변수(예: 상위, 토큰 매개 변수) 수준을 통해 자체 창을 변경하여 하위 창을 변경할 수 있습니다. 팝업 효과.

예를 들어:

TYPE_APPLICATION_SUB_PANEL: 애플리케이션 하위 패널 창입니다.

TYPE_APPLICATION_TOP_MOST: 애플리케이션의 최상위 창입니다.

TYPE_SYSTEM_ALERT: 배터리 부족 경고와 같은 시스템 수준 경고 정보를 표시하는 시스템 경고 창입니다.

TYPE_TOAST: 간단한 메시지를 표시하는 프롬프트 창입니다.

시스템 창

시스템 창은 시스템 수준 창으로 일반적으로 토스트, 입력 방법 창, 시스템 볼륨 표시줄 창 등과 같은 시스템 수준 정보나 대화 상자를 표시하는 데 사용됩니다. 이들은 모두 상대적으로 높은 우선 순위와 권한을 가진 시스템 수준 응용 프로그램입니다. 시스템 창의 유형도 WindowManager 클래스의 상수 값으로 정의되며 해당 유형 값의 범위는 2000에서 2999입니다. 시스템 창은 응용 프로그램 창 및 하위 창과 관련하여 가장 높은 수준이므로 응용 프로그램의 활성 창이 표시되는 경우에도 항상 화면 상단에 나타납니다.

예를 들어:

TYPE_STATUS_BAR: 시간, 전원 등과 같은 시스템 상태를 표시하는 상태 표시줄 창입니다.

TYPE_NAVIGATION_BAR: 탐색 모음 창은 화면 탐색을 제어하는 ​​데 사용되는 시스템 수준 창입니다.

TYPE_INPUT_METHOD: 사용자가 입력한 텍스트를 표시하는 입력 방법 창입니다.

TYPE_SYSTEM_OVERLAY: 다른 모든 창 위에 배치할 수 있는 시스템 오버레이 창입니다.

비활동 객체에서 정상적으로 Dialog 생성 및 표시

일반적으로 우리가 만드는 대화상자는 모두하위 창입니다. 하위 창은 애플리케이션 창에 따라 다르므로 다음과 같아야 합니다. 활동 컨텍스트 컨텍스트에서 전달됩니다.

서비스에서 대화 상자를 표시해야 하는 경우 시스템 창을 만들 수 있습니다.

  • SYSTEM_ALERT_WINDOW 권한을 신청해야 합니다.
  • Dialog.show 메서드를 호출하기 전에 대화 상자 창의 유형을 TYPE_SYSTEM_ALERT 또는 TYPE_APPLICATION_OVERLAY와 같은 SYSTEM_WINDOW 유형으로 지정해야 합니다.

—————————————————
참고 연접:

https://blog.csdn.net/qq_43358469/article/details/131121966

베테랑 안드로이드 드라이버가 뺨을 맞았습니다! Dialog에 해당하는 Context는 반드시 Activity여야 하나요? _mb648c193277ba0의 기술 블로그_51CTO 블로그

Supongo que te gusta

Origin blog.csdn.net/weixin_42602900/article/details/133859914
Recomendado
Clasificación