활동 컨텍스트와 애플리케이션 컨텍스트의 차이점


233

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

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

또한

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

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

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


이것이 내가 찾은 것 stackoverflow.com/questions/1561803/… ....
t0mm13b

14
이것은 상황을 정리하는데 도움이 될 것입니다 : 문맥, 어떤 문맥?
toobsco42

답변:


250

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

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

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

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


1
를 사용할 때 'java.lang.reflect.InvocationTargetException'을 얻었습니다. getApplicationContext흥미롭게도로 변경했을 때 this충돌하지 않고 예상대로 작동하지 않았습니다. 다른 사람은? 이 정보는 내가 희망하는 다른 사람들에게 도움이 될 것입니다 ... :) 신속한 답변에 감사드립니다 ...
t0mm13b

2
모든 것을 말할 수 있도록 전체 예외 스택 추적을 볼 필요가 있습니다. 그러나 내가 말했듯이 컨텍스트 인스턴스에는 다른 정보가 있습니다. 화면에 대화 상자 나 토스트를 표시하려면 Activity 인스턴스에만있는 Activity에 대한 정보가 필요합니다.
Cheryl Simon

74
나는 당신이 정당하지 않은 이유가 없다면 (즉, 대화 또는 토스트를 위해) 앱 컨텍스트를 사용한다고 말합니다. 서로 다른 상황에서 활동 컨텍스트를 사용하여 메모리 누수에 빠지기
Dori

10
Dave Smith는 컨텍스트 사용법을 이해하기 위해 매우 좋은 블로그 항목을 게시했습니다 ( 여기 참조) . 주석도 읽어보십시오!
ChrLipp

1
Dianna Hackborn조차도 활동 컨텍스트를 사용하는 것이 좋습니다. stackoverflow.com/questions/5228160/… 그러나 그녀는 이것에 대해 완전히 확신하지 못하는 것 같습니다.
JacksOnF1re

178

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

여기에 이미지 설명을 입력하십시오

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

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



자원을 얻는 것은 어떻습니까? 테이블에 추가하는 것이 좋습니다. applciation 컨텍스트를 사용하여 리소스에 액세스 할 수 있습니다.
Amir Ziarati

애플리케이션 컨텍스트에서 활동을 시작할 수 있습니다
Duy Phan

기사는 여기에서도 찾을 수 있습니다 : wundermanthompsonmobile.com/2013/06/context
Lifes

34

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


25
완전히 동의하십시오. 구글은이 공을 떨어 뜨렸다. 완전한 혼란입니다.
Søren Boisen

@ SørenBoisen 안드로이드 SDK는 완전한 혼란입니다
CommonSenseCode

그들은 혼란을 알고 있으며 가능한 한 많은 문제를 해결하기 위해 고심하고 있습니다.
pasignature

15

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


3

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

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


2

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


1

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

@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를 시작하면 모든 것이 잘 작동하며 동일한 작업에서 모든 활동을 실행하여 선형 백 스택 탐색이 가능합니다.

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

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.