활동 컨텍스트와 애플리케이션 컨텍스트의 차이점 이것은 나를 혼란스럽게 만들었습니다

이것은 나를 혼란스럽게 만들었습니다 .Android 2.1-r8 SDK에서 이것을 사용하고있었습니다.

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

또한

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

getApplicationContext()충돌을 사용하면 ….이 질문으로 연결됩니다.ProgressDialogToast

‘컨텍스트’라는 문구를 공유 함에도 불구하고 활동 컨텍스트와 애플리케이션 컨텍스트의 실제 차이점은 무엇입니까?



답변

둘 다 Context의 인스턴스 이지만 응용 프로그램 인스턴스는 응용 프로그램의 수명주기에 연결되고 Activity 인스턴스는 Activity의 수명주기에 연결됩니다. 따라서 응용 프로그램 환경에 대한 다른 정보에 액세스 할 수 있습니다.

getApplicationContext 에서 문서를 읽는 경우 라이프 사이클이 현재 컨텍스트와 분리 된 컨텍스트가 필요한 경우에만이를 사용해야한다는 점을 참고하십시오. 이것은 귀하의 예제 중 하나에 적용되지 않습니다.

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

그러나 적절한 이유가없는 한 일반적으로 활동 컨텍스트를 사용하십시오.


답변

이 테이블이 다른 유형의 컨텍스트를 사용할시기를 결정하는 데 매우 유용하다는 것을 알았습니다.

  1. 애플리케이션은 여기에서 활동을 시작할 수 있지만 새 태스크를 작성해야합니다. 이것은 특정 사용 사례에 맞을 수 있지만 응용 프로그램에서 비표준 백 스택 동작을 만들 수 있으며 일반적으로 권장되거나 권장되지 않습니다.
  2. 이것은 합법적이지만 인플레이션은 애플리케이션에 정의 된 것이 아니라 실행중인 시스템의 기본 테마로 수행됩니다.
  3. Android 4.2 이상에서 고정 브로드 캐스트의 현재 값을 얻는 데 사용되는 수신자가 널인 경우 허용됩니다.

원본 기사는 여기에 있습니다 .


답변

이것은 분명히 API 디자인의 결함입니다. 우선, 활동 컨텍스트와 애플리케이션 컨텍스트는 완전히 다른 객체이므로 컨텍스트가 사용되는 메소드 매개 변수는 상위 클래스 Context를 사용하는 대신 직접 ApplicationContext또는 Activity직접 사용해야합니다 . 두 번째로, 의사는 명시 적으로 사용할 컨텍스트를 지정해야합니다.


답변

내가 생각하는 이유 는 활동이 파괴 된 후에 대화 상자가 남아있을 수 없으므로 ProgressDialog활동을 첨부하는 것입니다. 따라서 활동 과 함께 파괴되는 ProgressDialog통과 this(ActivityContext)가 필요 하지만 활동이 끝난 후에도 ApplicationContext는 남아 있어야합니다. 파괴됨.


답변

자체적으로 전역 범위를 갖는 컨텍스트에 연결된 것이 필요한 경우 getApplicationContext ()를 사용하십시오.

Activity를 사용하는 경우 새 Activity 인스턴스에는 이전 Activity에 대한 암시 적 참조가있는 참조가 있으며 기존 Activity는 가비지 수집 할 수 없습니다.


답변

모든 것이 보여주기 위해 화면이 필요할 때 (버튼, 대화, 레이아웃 …) 컨텍스트 활동을 사용해야하고, 모든 것이 보여 주거나 처리하기 위해 화면이 필요하지 않다고 생각합니다 (토스트, 전화 서비스, 연락처 …) 응용 프로그램 컨텍스트를 사용할 수 있습니다


답변

홈 화면에서 직접 앱을 시작할 때와 공유 의도를 통해 다른 앱에서 앱을 시작할 때의 두 컨텍스트의 차이를 볼 수 있습니다.

@CommonSenseCode가 언급 한 “비표준 백 스택 동작”의 의미에 대한 실제 예는 다음과 같습니다.

서로 통신하는 두 개의 앱 App1App2 가 있다고 가정하십시오 .

시작 앱 2 : MainActivity 런처에서. 그런 다음 MainActivity에서 App2 : SecondaryActivity를 시작하십시오 . 활동 컨텍스트 또는 응용 프로그램 컨텍스트를 사용하면 두 활동이 모두 동일한 작업에 있으며 정상입니다 (모든 표준 시작 모드 및 의도 플래그를 사용하는 경우). 뒤로 누름으로 MainActivity로 돌아갈 수 있으며 최근 앱에는 하나의 작업 만 있습니다.

이제 App1에 있고 공유 의도 (ACTION_SEND 또는 ACTION_SEND_MULTIPLE)로 App2 : MainActivity 를 시작 한다고 가정 합니다. 그런 다음 App2 : SecondaryActivity 를 시작하십시오 (항상 모든 표준 실행 모드 및 인 텐트 플래그가 있음). 일어나는 일은 :

  • Android <10에서 애플리케이션 컨텍스트로 App2 : SecondaryActivity를 시작 하면 동일한 작업 에서 모든 활동을 시작할 수 없습니다 . 나는 안드로이드 7과 8을 사용해 보았고 SecondaryActivity는 항상 새로운 작업으로 시작됩니다 (App2 : SecondaryActivity는 App2 응용 프로그램 컨텍스트로 시작되었지만 App1에서 왔으며 App2 응용 프로그램을 직접 시작하지 않았기 때문입니다) 아마 안드로이드에서 그것을 인식하고 FLAG_ACTIVITY_NEW_TASK를 사용하십시오). 내 응용 프로그램이 나빴 기 때문에 필요에 따라 좋거나 나쁠 수 있습니다.
    Android 10에서 “액티비티 컨텍스트 외부에서 startActivity ()를 호출하면 FLAG_ACTIVITY_NEW_TASK 플래그가 필요합니다. 실제로 원하는 것입니까?”라는 메시지와 함께 앱이 충돌
    합니다. .
    따라서 Android 10에서 작동하게하려면 FALG_ACTIVITY_NEW_TASK를 사용해야하고 동일한 작업에서 모든 활동을 실행할 수는 없습니다.
    보시다시피 안드로이드 버전마다 동작이 다릅니다.

  • 활동 컨텍스트와 함께 App2 : SecondaryActivity를 시작하면 모든 것이 잘 작동하며 동일한 작업에서 모든 활동을 실행하여 선형 백 스택 탐색이 가능합니다.

유용한 정보를 추가했으면합니다.