source

활동 컨텍스트와 응용프로그램 컨텍스트의 차이

ittop 2023. 9. 24. 13:06
반응형

활동 컨텍스트와 응용프로그램 컨텍스트의 차이

Android 2.1-r8 SDK에서 사용하고 있었는데 당황스러웠습니다.

ProgressDialog.show(getApplicationContext(), ....);

에 있어서도

Toast t = Toast.makeText(getApplicationContext(),....);

getApplicationContext()합니다 모두 합니다.ProgressDialog그리고.Toast과 같은 됩니다. 이 질문으로 이어집니다.

'Context'라는 문구를 공유하고 있음에도 불구하고 활동 컨텍스트와 응용 프로그램 컨텍스트의 실제 차이점은 무엇입니까?

이 둘은 모두 컨텍스트의 인스턴스이지만, 응용프로그램 인스턴스는 응용프로그램의 라이프사이클과 연결되고, 액티비티 인스턴스는 액티비티의 라이프사이클과 연결됩니다.따라서 애플리케이션 환경에 대한 다양한 정보에 액세스할 수 있습니다.

getApplicationContext에서 문서를 읽을 경우 라이프사이클이 현재 컨텍스트와 분리된 컨텍스트가 필요한 경우에만 이를 사용해야 한다는 내용이 표시됩니다.이것은 두 예 모두에 해당되지 않습니다.

활동 컨텍스트에는 해당 통화를 완료하는 데 필요한 현재 활동에 대한 정보가 있을 수 있습니다.정확한 오류 메시지를 표시하면 필요한 것을 정확히 가리킬 수 있습니다.

그러나 일반적으로 그렇지 않은 경우 활동 컨텍스트를 사용합니다.

이 표는 다양한 유형의 컨텍스트를 사용할 시기를 결정하는 데 매우 유용합니다.

enter image description here

  1. 응용프로그램은 여기서 활동을 시작할 수 있지만 새 작업을 만들어야 합니다.이는 특정 사용 사례에 적합할 수 있지만, 애플리케이션에서 비표준 백스택 동작을 생성할 수 있으며 일반적으로 권장되지 않거나 모범 사례로 간주됩니다.
  2. 이는 합법적이지만, 애플리케이션에 정의된 내용이 아니라 실행 중인 시스템의 기본 테마로 인플레이션이 실행됩니다.
  3. Android 4.2 이상에서 수신기가 null일 경우, 끈적거리는 방송의 현재 값을 얻기 위해 사용됩니다.

이것은 분명히 API 설계의 결함입니다.선 활동 컨텍스트와 응용프로그램 컨텍스트다를 ApplicationContext아니면Activity부모 클래스 컨텍스트를 사용하는 대신 직접 사용합니다.두 번째로, 의사는 어떤 컨텍스트를 사용할지 명시적으로 지정해야 합니다.

ProgressDialog다를 되어 있습니다.ProgressDialog할 수 다 .this(ActivityContext) 또한 액티비티와 함께 삭제되지만, 액티비티가 삭제된 후에도 ApplicationContext는 유지됩니다.

홈 화면에서 직접 앱을 실행할 때와 공유 의도를 통해 다른 앱에서 실행할 때의 두 가지 상황의 차이를 확인할 수 있습니다.

@CommonSenseCode에서 언급한 "비표준 백스택 동작"의 실제 예시는 다음과 같습니다.

서로 통신하는 두 개의 앱, App1과 App2가 있다고 가정합니다.

앱2 실행:런처의 메인 액티비티.그런 다음 메인 액티비티 런칭 앱2에서:보조 활동.활동 컨텍스트 또는 응용프로그램 컨텍스트를 사용하여 두 활동 모두 동일한 작업에 상주하며 이는 모든 표준 시작 모드와 의도 플래그를 사용한다는 점을 고려할 때 괜찮습니다.뒤로 누르기로 메인 액티비티로 돌아갈 수 있으며 최근 앱에서는 한 가지 작업만 수행할 수 있습니다.

지금 앱1에 있다고 가정하고 앱2를 실행합니다.공유 의도를 가진 주 활동(ACTION_SEND 또는 ACTION_SEND_MULTIFUL).그런 다음 앱2를 실행해 보십시오.보조 활동(항상 모든 표준 발사 모드 및 의도 플래그 포함).결과는 다음과 같습니다.

  • App2를 실행하는 경우:Android < 10의 응용 프로그램 컨텍스트가 있는 보조 활동은 동일한 작업에서 모든 활동시작할 수 없습니다.Android 7 및 8로 시도해 보았는데 보조 활동은 항상 새 작업에서 시작됩니다(App2:보조 활동은 App2 애플리케이션 컨텍스트를 사용하여 시작되지만, App1에서 시작한 것이고 App2 애플리케이션을 직접 시작하지는 않았습니다.아마도 후드 안드로이드 아래에서 그것을 인식하고 FLAG_ACTIVE_NEW_TASK)를 사용할 것입니다.이것은 당신의 요구에 따라 좋을 수도 있고 나쁠 수도 있습니다, 왜냐하면 제 지원서가 나빴기 때문입니다.
    Android 10에서 앱이 메시지와 함께 충돌합니다.
    "Activity 컨텍스트 외부에서 startActivity()를 호출하려면 FLAG_ACTIVE_NEW_TASK 플래그가 필요합니다. 이것이 정말로 당신이 원하는 것입니까?"
    그래서 안드로이드 10에서 작동하려면 FALG_ACTIVITY_NEW_TASK를 사용해야 하며 같은 작업에서 모든 작업을 실행할 수는 없습니다.
    안드로이드 버전마다 동작이 다르다는 것을 알 수 있듯, 이상합니다.

  • App2를 실행하는 경우:활동 컨텍스트가 있는 보조 활동은 모두 잘 진행되며 동일한 작업에서 모든 활동을 실행하여 선형 백스택 탐색을 수행할 수 있습니다.

제가 유용한 정보를 추가했길 바랍니다.

모든 것에 화면이 필요할 때(버튼, 대화상자, 레이아웃...), 모든 것에 화면이 필요하지 않을 때(토스트, 서비스 전화, 연락처...) 애플리케이션 컨텍스트를 사용할 수 있습니다.

전역 범위를 가질 컨텍스트에 연결된 내용이 필요한 경우 getApplicationContext()를 사용합니다.

Activity를 사용하는 경우 새 Activity 인스턴스에 이전 Activity에 대한 암묵적인 참조가 있는 참조가 있으며, 이전 Activity는 가비지 컬렉션이 될 수 없습니다.

언급URL : https://stackoverflow.com/questions/4128589/difference-between-activity-context-and-application-context

반응형