prosource

활동 컨텍스트 또는 응용 프로그램 컨텍스트를 호출해야 하는 경우

probook 2023. 8. 6. 10:11
반응형

활동 컨텍스트 또는 응용 프로그램 컨텍스트를 호출해야 하는 경우

이 두 가지 맥락이 무엇인지에 대한 게시물이 많이 올라왔습니다.하지만 아직도 제대로 이해하지 못하고 있습니다.

내가 지금까지 이해한 바로는: 각 클래스는 일부 프로그래머가 사용할 것을 권장하는 클래스의 인스턴스입니다.this.getApplicationContext()메모리를 "제거"하지 않기 위해 가능한 한 자주 사용합니다.은 다른 하나의 하다하나는 입니다.this)로 Activity context는 "instance context"를 .Activity사용자가 전화기를 기울이거나 앱을 떠날 때마다 파괴되고 있습니다.가비지 컬렉터(GC)가 포착되지 않아 메모리를 너무 많이 사용하는 것 같습니다.

하지만 누가 그것이 사용하기에 적합한 정말 좋은 코딩 예시를 생각해 낼 수 있습니까?this하기 (현재상파기하악황기현▁(▁thegettingActivity애플리케이션 컨텍스트가 무용지물이 될 수 있습니까?

getApplicationContext()거의 항상 틀립니다.Hackborn 씨는 (다른 사람들 중에서도) 매우 노골적으로 당신이 사용하는 것은getApplicationContext()사용하는 이유를 알고 있을 때getApplicationContext()사용해야 할 경우에만getApplicationContext().

직설적으로 " 프로그래머는 "일적으로말는면하머래", "부프로그직설는""를 합니다.getApplicationContext()(또는)getBaseContext()그들의 Java 경험이 제한적이기 때문입니다. 클래스 그구예현니다합를스래클내부들은예)를 합니다.OnClickListener당분간Button순식간에Activity) 그리고 필요합니다.Context사용하기 보다는MyActivity.this외부 클래스에 도달하기 위해this그들은 사용합니다.getApplicationContext()또는getBaseContext()a를 얻기 위해Context물건.

사용자만getApplicationContext()당신이 필요하다는 것을 알았을 때Context 가능성보다 더 살 수 .Context자유롭게 사용할 수 있습니다.시나리오는 다음과 같습니다.

  • 사용하다getApplicationContext()만약 당신이 무언가에 묶인 것이 필요하다면.Context그 자체가 세계적인 범위를 가질 것입니다.사용합니다getApplicationContext()를 들어, 예들어에에서, 서를.WakefulIntentService 적인정의 WakeLock서비스에 사용할 수 있습니다. WakeLock정적이고, 나는 필요합니다.Context에 도달하기 위해PowerManager그것을 만들기 위해, 사용하는 것이 가장 안전합니다.getApplicationContext().

  • 사용하다getApplicationContext()에 때ServiceActivity에 .ServiceConnection) 의 (즉, 바의손잡이이) 사Activity을 통한 onRetainNonConfigurationInstance()Android는 Android를 합니다.ServiceConnections그리고 다음에 대한 참조를 보유하고 있습니다.Contexts결합을 만드는 것.에서 ,Activity그 다음에 새로운Activity는 인턴스다대참가것질입니다를조한음스는에▁to▁the에 대한 참조를 가질 것입니다.ServiceConnection오래된 것에 대한 암묵적인 언급이 있습니다.Activity 옛날 그리고노인들노▁and인.Activity가비지를 수집할 수 없습니다.

은 일부개사지용하클사용다의 사용자 지정 합니다.Application데이터의 그들이 그들자글신로데위해이를터벌을 통해 합니다.getApplicationContext()그것은 확실히 가능합니다.하나의 사용자 지정만 가능한 경우 정적 데이터 멤버를 선호합니다.Application물건.사용자 지정을 사용하여 하나의 앱을 구축했습니다.Application반대하고 고통스럽다는 것을 알았습니다.Hackborn 씨도 이 입장에 동의합니다.

다음은 사용하지 않는 이유입니다.getApplicationContext()어디를 가든:

  • 완한것아닙다가 아닙니다.Context모든 하는 것.Activity이 이 다합으로 다양한 . 당신이 이것으로 시도할 다양한 것들.Context대부분 GUI와 관련하여 실패합니다.

  • 누수가 할 수 .ContextgetApplicationContext()사용자의 호출로 인해 생성된 것을 보관하고 있지만 정리하지는 않습니다.와 함께Activity, ▁the▁if단,면.Activity쓰레기를 수거하면 다른 모든 것들도 쓸려나갑니다.Application개체는 프로세스의 수명 동안 남아 있습니다.

SDK 사이트에 제대로 기록되지 않은 것이 많은 것 같습니다, 이것도 그 중 하나입니다.제가 주장하고자 하는 것은 애플리케이션 컨텍스트를 사용하는 것으로 기본 설정하고 필요할 때만 활동 컨텍스트를 사용하는 것이 더 낫다는 것입니다.작업 컨텍스트가 필요한 유일한 위치는 진행 대화 상자입니다.SBERG412는 토스트 메시지에 활동 컨텍스트를 사용해야 한다고 주장하지만 Android 문서에는 사용 중인 응용 프로그램 컨텍스트가 명확하게 표시됩니다.저는 이 구글 사례 때문에 항상 토스트에 애플리케이션 컨텍스트를 사용했습니다.그렇게 하는 것이 잘못된 것이라면, 구글은 여기서 공을 떨어뜨렸습니다.

다음은 생각해 보고 검토할 사항입니다.

건배 메시지의 경우, Google Dev Guide는 애플리케이션 컨텍스트를 사용하고 사용할 것을 명시적으로 말합니다: 건배 알림

개발 가이드의 대화 상자 섹션에는 AlertDialog가 표시됩니다.작성기는 응용프로그램 컨텍스트를 사용하고 진행률 표시줄은 활동 컨텍스트를 사용합니다.이것은 구글에 의해 설명되지 않습니다.대화상자

애플리케이션 컨텍스트를 사용하는 좋은 이유는 방향 변경과 같은 구성 변경을 처리하고 Views와 같은 컨텍스트가 필요한 개체를 유지하려는 경우인 것 같습니다.여기를 보면: 실행 시간 변경 작업 컨텍스트를 사용하는 것에 대한 주의 사항이 있으며, 이로 인해 누출이 발생할 수 있습니다.이 문제는 유지할 뷰가 있는 애플리케이션 컨텍스트에서 방지할 수 있습니다(적어도 제가 이해하기로는 그렇습니다).제가 쓰고 있는 앱에서 저는 애플리케이션 컨텍스트를 사용하려고 합니다. 왜냐하면 저는 방향 변경에 대해 몇 가지 보기와 다른 것들을 유지하려고 노력하고 있고, 여전히 활동이 방향 변경에 대해 파괴되고 다시 생성되기를 원하기 때문입니다.따라서 메모리 누수가 발생하지 않도록 앱 컨텍스트를 사용해야 합니다(메모리 누수 방지 참조).제가 보기에는 활동 컨텍스트 대신 애플리케이션 컨텍스트를 사용해야 하는 충분한 이유가 있는 것 같습니다. 그리고 제가 보기에는 활동 컨텍스트보다 애플리케이션 컨텍스트를 더 자주 사용하는 것 같습니다.제가 경험한 많은 안드로이드 책들이 그렇게 하는 것 같고, 제가 본 구글 사례들 중 많은 것들이 그렇게 합니다.

Google 문서는 애플리케이션 컨텍스트를 사용하는 것이 대부분의 경우 완벽하게 문제가 없는 것처럼 보이게 하며, 실제로는 예제(적어도 내가 본 예제)에서 활동 컨텍스트를 사용하는 것보다 더 자주 나타납니다.응용프로그램 컨텍스트를 사용하는 것이 정말로 문제라면, 구글은 정말로 이것에 더 중점을 두어야 합니다.그들은 그것을 명확히 할 필요가 있고, 그들은 그들의 예를 다시 할 필요가 있습니다.나는 이것을 전적으로 경험이 없는 개발자들에게 탓하지 않을 것입니다. 왜냐하면 구글은 정말로 애플리케이션 컨텍스트를 사용하는 것이 문제가 되지 않는 것처럼 보이기 때문입니다.

응용프로그램 컨텍스트와 같은 다양한 유형의 컨텍스트(예:getApplicationContext()) 및 활동 컨텍스트, BroadcastReceiver 컨텍스트:

enter image description here

더 많은 정보를 얻기 위해 모든 장점은 여기에 있는 원저자에게 있습니다.

어떤 컨텍스트를 사용해야 합니까?

컨텍스트에는 두 가지 유형이 있습니다.

  1. 응용프로그램 컨텍스트는 응용프로그램과 연결되어 있으며 응용프로그램의 수명 동안 항상 동일합니다. 변경되지 않습니다.따라서 토스트를 사용하는 경우 프로그램 내 어디에서나 토스트를 표시할 수 있고 특정 창에 연결되지 않으므로 프로그램 컨텍스트 또는 활동 컨텍스트(둘 다)를 사용할 수 있습니다.그러나 많은 예외가 있습니다. 한 가지 예외는 활동 컨텍스트를 사용하거나 전달해야 할 때입니다.

  2. 활동 컨텍스트는 활동과 연관되어 있으며, 활동이 삭제되면 삭제될 수 있습니다. 단일 응용프로그램에 여러 활동이 있을 수 있습니다.때로는 활동 상황에 맞는 핸들이 절대적으로 필요할 때도 있습니다.예를 들어, 새 활동을 시작할 경우 활동 스택 측면에서 새 활동이 현재 활동과 연결되도록 의도에 있는 활동 컨텍스트를 사용해야 합니다.그러나 응용프로그램의 컨텍스트를 사용하여 새 활동을 시작할 수도 있지만 플래그를 설정해야 합니다.Intent.FLAG_ACTIVITY_NEW_TASK그것을 새로운 일로 취급하려는 의도에서.

몇 가지 경우를 고려해 보겠습니다.

  • MainActivity.this활동 클래스를 확장하는 기본 활동 컨텍스트이지만 기본 클래스(활동)도 컨텍스트 클래스를 확장하므로 활동 컨텍스트를 제공하는 데 사용할 수 있습니다.

  • getBaseContext()활동 컨텍스트를 제공합니다.

  • getApplication()응용 프로그램 컨텍스트를 제공합니다.

  • getApplicationContext()또한 응용 프로그램 컨텍스트도 제공합니다.

자세한 내용은 이 링크를 참조하십시오.

지원하는 모든 작업에 애플리케이션 컨텍스트를 사용하지 않는 이유가 궁금합니다.결국 메모리 누수 가능성을 낮추고 getContext() 또는 getActivity()에 대한 null 검사를 누락시킵니다(주입된 애플리케이션 컨텍스트를 사용하거나 애플리케이션에서 정적 방법을 통해 획득한 경우).필요한 경우에만 애플리케이션 컨텍스트를 사용하라는 Hackborn 씨의 진술과 같은 진술은 이유에 대한 설명 없이는 설득력이 없어 보입니다.하지만 맹세할 수 없는 이유를 찾은 것 같습니다.

일부 Android 버전/장치 조합에 이러한 규칙을 따르지 않는 문제가 있습니다.예를 들어 컨텍스트를 통과하는 BroadcastReceiver가 있는 경우 컨텍스트를 응용 프로그램 컨텍스트로 변환한 다음 응용 프로그램 컨텍스트에서 registerReceiver()를 호출하려고 하면 이 작업이 제대로 작동하는 경우가 많지만 ReceiverCallNotAllowed로 인해 충돌이 발생하는 경우도 많습니다.예외.이러한 충돌은 API 15부터 22까지 다양한 Android 버전에서 발생합니다.https://possiblemobile.com/2013/06/context/ #2021-2443283

아래 표에서 Application Context에서 지원하는 모든 작업이 모든 Android 장치에서 작동하는 것은 보장되지 않기 때문입니다! enter image description here

작업 컨텍스트를 사용해야 하는 경우와 응용 프로그램 컨텍스트를 사용해야 하는 경우의 두 가지 좋은 예는 토스트 메시지 또는 기본 제공 대화 상자 메시지가 응용 프로그램 컨텍스트를 사용하면 예외가 발생하는 경우입니다.

ProgressDialog.show(this, ....);

또는

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

이 두 가지 모두 응용프로그램 컨텍스트에 제공되지 않는 활동 컨텍스트의 정보가 필요합니다.

응용프로그램 컨텍스트는 응용프로그램이 활성화될 때까지만 활성화되며 작업 수명 주기에 따라 달라지지 않지만 컨텍스트는 개체를 오래 유지합니다.사용자가 임시로 사용하는 개체는 해당 시간에 응용프로그램 컨텍스트 및 활동 컨텍스트사용하는 경우 응용프로그램 컨텍스트와 완전히 반대로 사용됩니다.

언급URL : https://stackoverflow.com/questions/7298731/when-to-call-activity-context-or-application-context

반응형