안드로이드에서 '컨텍스트'를 얻는 정적 인 방법?


970

Context정적 메서드 내 에서 현재 인스턴스 를 가져 오는 방법이 있습니까?

변경 될 때마다 '컨텍스트'인스턴스를 저장하는 것을 싫어하기 때문에 그런 식으로 찾고 있습니다.


57
컨텍스트를 저장하지 않는 것은 불편한 것이 아니라 메모리 누수로 이어질 수 있기 때문에 좋은 아이디어입니다!
— Vikram Bodicherla

12
@VikramBodicherla 네,하지만 아래 답변은 응용 프로그램 컨텍스트에 대해 이야기하고 있다고 가정합니다. 따라서 메모리 누수는 문제가되지 않지만 사용자는 사용하기에 적합한 컨텍스트에서만 이러한 솔루션을 사용해야합니다.
— Tom

정적 인 방법을 사용해야하는 Context경우 코드를 디자인하는 더 좋은 방법이있을 수 있습니다.
— Anonsage 2019

3
안드로이드 문서는 싱글 톤 게터에게 컨텍스트를 전달할 것을 권장합니다. developer.android.com/reference/android/app/Application.html
— 마르코 Luglio

정적 컨텍스트 이상의 getInstance ()로 전달 된 싱글 및 컨텍스트를 선호, 나는 여기에 내 이유를 설명하려고 노력 코드 지원, 보라하시기 바랍니다 stackoverflow.com/a/38967293/4469112
— 알레

답변:


1302

이 작업을 수행:

Android Manifest 파일에서 다음을 선언하십시오.

<application android:name="com.xyz.MyApplication">

</application>

그런 다음 수업을 작성하십시오.

public class MyApplication extends Application {

    private static Context context;

    public void onCreate() {
        super.onCreate();
        MyApplication.context = getApplicationContext();
    }

    public static Context getAppContext() {
        return MyApplication.context;
    }
}

이제 어디서나 MyApplication.getAppContext()응용 프로그램 컨텍스트를 정적으로 가져옵니다.


81
이 방법의 단점이 있습니까? 이것은 부정 행위처럼 보인다. (해킹?)
— jjnguy

203
단점은 일부 정적 초기화 코드가 Context 객체를 가져 오기 전에 정적이 아닌 onCreate ()가 호출되었다는 보장이 없다는 것입니다. 즉, 호출 코드는이 질문의 요점을 무너 뜨리는 null 값을 처리 할 준비가되어 있어야합니다.
— Melinda Green

8
또한이 static context변수를 volatile? 로 선언해야 합니까?
— Vladimir Sorokin

14
@Tom 정적 데이터 멤버가 처음에 정적으로있는 경우는 아닙니다. 주어진 코드에서 정적 멤버는 onCreate ()에서 비 정적으로 초기화됩니다. 이 경우에는 정적으로 초기화 된 데이터라도 충분하지 않습니다. 다른 클래스의 정적 초기화 중에 액세스하기 전에 주어진 클래스의 정적 초기화가 발생하지 않을 것이기 때문입니다.
— Melinda Green

10
@MelindaGreen Application 설명서에 따르면 활동, 서비스 또는 수신자 (콘텐츠 공급자 제외)를 만들기 전에 onCreate ()가 호출됩니다. 따라서 컨텐츠 제공자로부터 getAppContext ()에 액세스하지 않는 한이 솔루션이 안전하지 않습니까?
— Magnus여

86

응용 프로그램 컨텍스트를 얻는 편리한 방법을 원하는 대부분의 응용 프로그램은 확장하는 자체 클래스를 만듭니다 android.app.Application.

안내서

먼저 다음과 같이 프로젝트에서 클래스를 작성하여이를 수행 할 수 있습니다.

import android.app.Application;
import android.content.Context;

public class App extends Application {

    private static Application sApplication;

    public static Application getApplication() {
        return sApplication;
    }

    public static Context getContext() {
        return getApplication().getApplicationContext();
    }

    @Override
    public void onCreate() {
        super.onCreate();
        sApplication = this;
    }
}

그런 다음 AndroidManifest에서 AndroidManifest.xml의 태그에 클래스 이름을 지정해야합니다.

<application 
    ...
    android:name="com.example.App" >
    ...
</application>

그런 다음 다음을 사용하여 정적 메소드에서 애플리케이션 컨텍스트를 검색 할 수 있습니다.

public static void someMethod() {
    Context context = App.getContext();
}

경고

위와 같은 것을 프로젝트에 추가하기 전에 문서의 내용을 고려해야합니다.

일반적으로 Application을 서브 클래 싱 할 필요가 없습니다. 대부분의 상황에서 정적 싱글 톤은 더 모듈 방식으로 동일한 기능을 제공 할 수 있습니다. 싱글 톤에 글로벌 컨텍스트가 필요한 경우 (예 : 브로드 캐스트 수신기 등록) 싱글 톤을 처음 생성 할 때 내부적으로 Context.getApplicationContext ()를 사용하는 컨텍스트를 검색하는 함수를 검색 할 수 있습니다.


반사

리플렉션을 사용하여 응용 프로그램 컨텍스트를 얻는 또 다른 방법이 있습니다. 리플렉션은 종종 안드로이드에서 내려다보고 있으며 개인적으로 이것이 프로덕션에서 사용해서는 안된다고 생각합니다.

애플리케이션 컨텍스트를 검색하려면 API 1부터 사용 가능한 숨겨진 클래스 ( ActivityThread ) 에서 메소드를 호출해야합니다 .

public static Application getApplicationUsingReflection() throws Exception {
    return (Application) Class.forName("android.app.ActivityThread")
            .getMethod("currentApplication").invoke(null, (Object[]) null);
}

정적 방식으로 응용 프로그램 컨텍스트를 얻는 방법을 제공하는 숨겨진 클래스 ( AppGlobals ) 가 하나 더 있습니다 . 컨텍스트를 사용 ActivityThread하므로 다음 방법과 위에 게시 된 방법 사이에는 아무런 차이가 없습니다.

public static Application getApplicationUsingReflection() throws Exception {
    return (Application) Class.forName("android.app.AppGlobals")
            .getMethod("getInitialApplication").invoke(null, (Object[]) null);
} 

행복한 코딩!


56

우리가 Application Context를 얻는 것에 대해 이야기하고 있다고 가정하면 @Rohit Ghatol이 Application을 확장하여 제안한대로 구현했습니다. 그런 다음, 그런 식으로 검색된 컨텍스트가 항상 널이 아님을 보증하지 않습니다. 필요할 때 일반적으로 시간을 지연시킬 수없는 도우미를 초기화하거나 리소스를 얻으려고하기 때문입니다. null을 처리하면 도움이되지 않습니다. 그래서 나는 문서에 명시된 것처럼 기본적으로 Android 아키텍처와 싸우고 있음을 이해했습니다.

참고 : 일반적으로 Application을 서브 클래스화할 필요는 없습니다. 대부분의 상황에서 정적 싱글 톤은보다 모듈 방식으로 동일한 기능을 제공 할 수 있습니다. 싱글 톤에 글로벌 컨텍스트가 필요한 경우 (예 : 브로드 캐스트 수신자 등록) 싱글 톤의 getInstance () 메소드를 호출 할 때 Context.getApplicationContext ()를 컨텍스트 인수로 포함하십시오.

Dianne Hackborn의 설명

응용 프로그램이 당신이 얻을 수있는 것으로 존재하는 유일한 이유는 1.0 이전 개발 과정에서 응용 프로그램 개발자 중 한 명이 더 "정상적으로 얻을 수있는 응용 프로그램 객체를 가질 필요가 있다는 것에 대해 계속 나를 괴롭 혔기 때문입니다. "그들에게 응용 프로그램 모델을 제공하고 결국 포기했습니다. 나는 그 제안을 영원히 후회할 것입니다. :)

그녀는 또한이 문제에 대한 해결책을 제안하고 있습니다.

원하는 것이 앱의 다른 부분에서 공유 할 수있는 전역 상태 인 경우 싱글 톤을 사용하십시오. [...] 그리고 이것은보다 자연스럽게 이러한 것들을 어떻게 관리해야하는지에 따라 온 디맨드 방식으로 초기화됩니다.

그래서 내가 한 것은 Application 확장을 없애고 컨텍스트를 싱글 톤 도우미의 getInstance ()에 직접 전달하면서 개인 생성자에서 응용 프로그램 컨텍스트에 대한 참조를 저장하는 것입니다.

private static MyHelper instance;
private final Context mContext;    

private MyHelper(@NonNull Context context) {
    mContext = context.getApplicationContext();
}

public static MyHelper getInstance(@NonNull Context context) {
    synchronized(MyHelper.class) {
        if (instance == null) {
            instance = new MyHelper(context);
        }
        return instance;
    }
}

그러면 호출자는 로컬 컨텍스트를 헬퍼에게 전달합니다.

Helper.getInstance(myCtx).doSomething();

따라서이 질문에 올바르게 대답하려면 응용 프로그램 컨텍스트에 정적으로 액세스하는 방법이 있지만 모두 권장하지 않아야하며 단일 컨텍스트의 getInstance ()에 로컬 컨텍스트를 전달하는 것이 좋습니다.


관심있는 사람은 fwd blog 에서 더 자세한 버전을 읽을 수 있습니다.


1
@Alessio이 방법은 메모리 누수로 이어지지 않습니다
— Phillip Kigenyi

2
@codephillip 나는 당신이 무엇을 말하는지 이해하지 못합니다. 싱글 톤은 호스트 활동이 아니라 전달 된 활동에서 검색된 애플리케이션 컨텍스트를 참조합니다. 합법적이며 메모리 누수가 발생하지 않습니다. 그것이 제가 쓴 블로그의 요점입니다 . 당신이 정말로 옳다고 생각한다면, 내가 말하고있는 메모리 누수를 재현 할 수있는 샘플 코드를 보내 주시기 바랍니다. 그렇지 않습니다.
— Alessio

1
@KigenyiPhillip이 정확하다고 생각하며 여전히 리소스 누수를 나타냅니다. 에 처음 전화 한 후 참조 차트를 그림으로 표시하십시오 getInstance(ctx). 당신은 GC 루트이 instance유형의 MyHelper개인 필드가, mContext유형의 Context컨텍스트를 통해 수집 된 애플리케이션 컨텍스트가 전달 된 참조를 getInstance(). instance는 두 번째로 설정되거나 해제되지 않으므로 GC는에서 참조하는 앱 컨텍스트를 절대로 포착하지 않습니다 instance. 활동을 유출하지 않으므로 저렴한 IMO입니다.
— 마크 맥 케나

1
@MarkMcKenna는 "응용 프로그램 컨텍스트를 참조하는 Context 유형의 개인 필드 mContext가 있습니다"라고 말하면 mContext는 컨텍스트가 아닌 응용 프로그램 컨텍스트에 대한 참조라는 것이 분명합니다. 에서 getApplicationContext () 문서 읽고 : "누구의 라이프 사이클 과정보다는 현재 구성 요소의 수명에 묶여 현재 컨텍스트, 별도의 컨텍스트를". 어떻게 메모리 누수가 발생합니까? 응용 프로그램 컨텍스트는 프로세스가 종료 될 때만 GC됩니다.
— Alessio

1
@Alessio 응용 프로그램 컨텍스트에 대한 참조가 리소스 누수로 인정되지 않는다는 사실을 인정하면 this에 정적 참조를 게시하여이를 단순화 Application.onCreate()하여 더 나은 답변을 얻을 수 있습니다.
— 마크 맥 케나


38

다음은 UI 스레드의 어느 곳에서나 응용 프로그램 (컨텍스트) 을 얻는 문서화되지 않은 방법 입니다. 숨겨진 정적 메소드에 의존합니다 . 최소한 Android 4.x에서 작동해야합니다.ActivityThread.currentApplication()

try {
    final Class<?> activityThreadClass =
            Class.forName("android.app.ActivityThread");
    final Method method = activityThreadClass.getMethod("currentApplication");
    return (Application) method.invoke(null, (Object[]) null);
} catch (final ClassNotFoundException e) {
    // handle exception
} catch (final NoSuchMethodException e) {
    // handle exception
} catch (final IllegalArgumentException e) {
    // handle exception
} catch (final IllegalAccessException e) {
    // handle exception
} catch (final InvocationTargetException e) {
    // handle exception
}

UI 스레드 외부에서 메소드를 호출하거나 애플리케이션이 스레드에 바인드되지 않은 경우이 메소드가 널을 리턴 할 수 있습니다.

응용 프로그램 코드를 변경할 수 있으면 @RohitGhatol 솔루션 을 사용하는 것이 좋습니다 .


1
위의 KennyTM 메소드를 사용했지만 때로는 메소드가 null을 반환합니다. 이것에 대한 다른 대안이 있습니까? 여기서 null을 얻는 것처럼 다른 곳에서 컨텍스트를 검색 할 수 있습니다. 제 경우에는 Application의 onCreate ()가 호출되지 않습니다. 그러나 위의 메소드는 그 전에 호출됩니다. Plzzz help
— AndroidGuy

GC가 모든 활동 관련 항목을 정리 한 경우 항상 작동하지는 않습니다.
— AlexVPerl

32

컨텍스트를 사용하는 대상에 따라 다릅니다. 그 방법에 대한 하나 이상의 단점을 생각할 수 있습니다.

AlertDialogwith 를 만들려고 AlertDialog.Builder하면 Application컨텍스트가 작동하지 않습니다. 나는 현재의 상황이 필요하다고 생각합니다 Activity...


6
맞습니다. 이를 위해 애플리케이션 컨텍스트를 사용하는 경우 포 그라운드 활동 아래에 대화 상자가 보이지 않을 수 있습니다.
— Nate

3
우선 +1 그리고 가능한 오류는 ActivityInfo {com.samples / com.MyActivity} 액티비티를 시작할 수 없습니다 : android.view.WindowManager $ BadTokenException : 창을 추가 할 수 없습니다-토큰 널은 응용 프로그램에 대한 것이 아닙니다
— Govind

15

코 틀린 방법 :

명백한:

<application android:name="MyApplication">

</application>

MyApplication.kt

class MyApplication: Application() {

    override fun onCreate() {
        super.onCreate()
        instance = this
    }

    companion object {
        lateinit var instance: MyApplication
            private set
    }
}

그런 다음 다음을 통해 속성에 액세스 할 수 있습니다 MyApplication.instance


11

당신이 사용하는 열려있는 경우 RoboGuice을 , 당신은 당신이 원하는 모든 클래스에 주입 된 컨텍스트를 가질 수있다. 다음은 RoboGuice 2.0으로 작성하는 방법에 대한 작은 샘플입니다 (이 글을 쓰는 시점의 베타 4).

import android.content.Context;
import android.os.Build;
import roboguice.inject.ContextSingleton;

import javax.inject.Inject;

@ContextSingleton
public class DataManager {
    @Inject
    public DataManager(Context context) {
            Properties properties = new Properties();
            properties.load(context.getResources().getAssets().open("data.properties"));
        } catch (IOException e) {
        }
    }
}

8

나는 이것을 어느 시점에서 사용했다 :

ActivityThread at = ActivityThread.systemMain();
Context context = at.getSystemContext();

이것은 시스템 서비스를 얻는 데 사용하고 작업 한 유효한 컨텍스트입니다.

그러나 프레임 워크 / 기본 수정에서만 사용했으며 Android 응용 프로그램에서는 시도하지 않았습니다.

경고 당신이 알고 있어야 :이 문맥에 방송 수신기를 등록 할 때, 그것은 작동하지 않습니다 그리고 당신은 얻을 것이다 :

java.lang.SecurityException : 지정된 호출자 패키지 android가 ProcessRecord 프로세스에서 실행되고 있지 않습니다.


7

코 틀린

open class MyApp : Application() {
    override fun onCreate() {
        super.onCreate()
        mInstance = this
    }

    companion object {
        lateinit var mInstance: MyApp
        fun getContext(): Context? {
            return mInstance.applicationContext
        }
    }
}

같은 컨텍스트를 얻을

MyApp.mInstance

또는

MyApp.getContext()

4

다음을 사용할 수 있습니다.

MainActivity.this.getApplicationContext();

MainActivity.java :

...
public class MainActivity ... {
    static MainActivity ma;
...
    public void onCreate(Bundle b) {
         super...
         ma=this;
         ...

다른 수업 :

public ...
    public ANY_METHOD... {
         Context c = MainActivity.ma.getApplicationContext();

3
내부 클래스 내부에있는 경우에만 작동하며 OP의 경우는 거의 없습니다.
— Richard J. Ross III

3
이것은 MainActivity가 생성 된 후에 ANY_METHOD가 호출되는 한 작동하지만 활동에 대한 정적 참조를 유지하면 필연적으로 메모리 누수가 발생합니다 (OP의 질문에 대한 다른 응답이 이미 언급했듯이) 실제로 정적 참조를 유지 해야하는 경우 응용 프로그램을 사용하십시오 컨텍스트 만.
— handtwerk

1
내부 수업은 사악합니다. 최악의 부분은 많은 튜토리얼이 그렇게하기 때문에 많은 사람들이 AsyncTasks와 그와 같은 일을한다는 것입니다.
— Reinherd

4

매니페스트 파일을 수정하지 않으려는 경우 초기 활동에서 정적 변수에 컨텍스트를 수동으로 저장할 수 있습니다.

public class App {
    private static Context context;

    public static void setContext(Context cntxt) {
        context = cntxt;
    }

    public static Context getContext() {
        return context;
    }
}

활동 (또는 활동)이 시작될 때 컨텍스트를 설정하십시오.

// MainActivity

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    // Set Context
    App.setContext(getApplicationContext());

    // Other stuff
}

참고 : 다른 답변과 마찬가지로 이것은 잠재적 인 메모리 누수입니다.


1
이 경우 컨텍스트가 애플리케이션에 바인드되므로 정확히 유출되는 것은 무엇입니까? 응용 프로그램이 종료되면 다른 모든 작업도 종료됩니다.
— TheRealChx101

3

나는 당신이 getAppContext()방법에 대한 몸이 필요하다고 생각합니다 :

public static Context getAppContext()
   return MyApplication.context; 

3

이 소스 에 따르면 ContextWrapper를 확장하여 자신의 컨텍스트를 얻을 수 있습니다

public class SomeClass extends ContextWrapper {

    public SomeClass(Context base) {
      super(base);
    }

    public void someMethod() {
        // notice how I can use "this" for Context
        // this works because this class has it's own Context just like an Activity or Service
        startActivity(this, SomeRealActivity.class);

        //would require context too
        File cacheDir = getCacheDir();
    }
}

ContextWrapper 용 JavaDoc

모든 호출을 다른 컨텍스트에 위임하는 컨텍스트 프록시 구현. 원래 컨텍스트를 변경하지 않고 동작을 수정하기 위해 서브 클래 싱 할 수 있습니다.


1
이것은 흥미 롭다. ContextWrapper에 대해 배우는 것이 좋습니다. 그러나 응용 프로그램 컨텍스트를이 생성자로 전달해야하는 경우에도 어딘가에서 가져와야합니다.
— jk7

2

어떤 이유로 든 응용 프로그램 / 활동을 확장하는 것뿐만 아니라 일부 팩토리 또는 도우미 클래스에 대한 응용 프로그램 컨텍스트를 모든 클래스에서 원한다면. 앱에 다음 싱글 톤을 추가 할 수 있습니다.

public class GlobalAppContextSingleton {
    private static GlobalAppContextSingleton mInstance;
    private Context context;

    public static GlobalAppContextSingleton getInstance() {
        if (mInstance == null) mInstance = getSync();
        return mInstance;
    }

    private static synchronized GlobalAppContextSingleton getSync() {
        if (mInstance == null) mInstance = 
                new GlobalAppContextSingleton();
        return mInstance;
    }

    public void initialize(Context context) {
        this.context = context;
    }

    public Context getApplicationContext() {
        return context;
    }
}

그런 다음 응용 프로그램 클래스의 onCreate에서 초기화하십시오.

GlobalAppContextSingleton.getInstance().initialize(this);

전화로 어디서나 사용

GlobalAppContextSingleton.getInstance().getApplicationContext()

그러나 응용 프로그램 컨텍스트 이외의 다른 방법으로는이 방법을 권장하지 않습니다. 메모리 누수가 발생할 수 있습니다.


그것은 클래스 / 메서드 이름이 돌로 설정되어 있고, 길고, Q & A에 대한 설명이 있고, 내가 사용하기 위해 짧게 유지하는 것과는 다릅니다.
— Versa

1

나는 이것을 돕기 위해 Singleton 디자인 패턴의 변형을 사용합니다.

import android.app.Activity;
import android.content.Context;

public class ApplicationContextSingleton {
    private static Activity gContext;

    public static void setContext( Activity activity) {
        gContext = activity;
    }

    public static Activity getActivity() {
        return gContext;
    }

    public static Context getContext() {
        return gContext;
    }
}

그런 다음 ApplicationContextSingleton.setContext( this );내 activity.onCreate () 및 onDestroy ()ApplicationContextSingleton.setContext( null ); 에서 호출합니다 .


컨텍스트 만 있으면 activity.getApplicationContext ()를 호출 할 수 있습니다. 누출에 대해 걱정할 필요없이 정적으로 유지할 수 있습니다.
— MinceMan

2
메모리 누수가 발생합니다
— BlueWizard

1

방금 Vapor API 라는 Android 용 jQuery에서 영감을 얻은 프레임 워크를 출시 하여 앱 개발을보다 단순하게 만들었습니다.

중앙 $파사드 클래스 는 WeakReference(Ethan Nicholas의 멋진 Java 블로그 게시물 링크)를 Activity호출하여 검색 할 수 있는 현재 컨텍스트를 유지합니다.

$.act()

A WeakReference는 가비지 수집에서 원래 개체를 회수하지 못하도록 참조를 유지하므로 메모리 누수에 문제가 없어야합니다.

물론 단점은 $.act()null을 반환 할 수 있는 위험을 감수한다는 것 입니다. 나는이 시나리오를 아직 보지 않았으므로 언급 할 가치가있는 최소한의 위험 일 것입니다.

클래스 VaporActivity로 사용하지 않는 경우 컨텍스트를 수동으로 설정할 수도 있습니다 Activity.

$.act(Activity);

또한 Vapor API 프레임 워크의 대부분은이 저장된 컨텍스트를 본질적으로 사용하므로 프레임 워크를 사용하기로 결정한 경우 직접 저장하지 않아도됩니다. 자세한 내용과 샘플 은 사이트 를 확인하십시오 .

나는 그것이 도움이되기를 바랍니다 :)


1
명백하게 이것은 단지 downvoted했다.. 설명은 좋을 것이다!?
— Darius

1
나는 이것을 하향 투표하지 않았지만 Javascript는 당면한 질문과 관련이 없으며, 그것은 당신이 가지고 있었던 모든 하향 투표를 설명합니다! 건배.
— Ernani Joppert

유창한 인터페이스 및 추상화와 같은 jQuery의 일부 측면 에서 영감을 얻은 점 을 고려하면 이는 무의미 합니다.
— 다리우스

1
동일한 플랫폼에 있지 않은 프레임 워크의 API 시맨틱 스에서 영감을 받아 다운로드하고 있습니까?! 나는 당신이 플랫폼에 독립적 인 원칙을 적용하는 요점을 놓친다고 생각합니다 ..................................
— 다리우스

3
이 답변은 JavaScript와 전혀 관련이 없습니다. downvote 전에 답을 읽으십시오 : /
— BlueWizard

1

Rohit의 대답은 맞습니다. 그러나 AndroidStudio의 "Instant Run"은 static Context내가 아는 한 코드에 속성이 없는 것에 달려 있습니다.


1
네 말이 맞아 또한 메모리 누수가 발생합니다!
— user1506104

1

Kotlin에서 Context / App Context를 컴패니언 객체에 넣으면 여전히 경고가 발생합니다. Do not place Android context classes in static fields; this is a memory leak (and also breaks Instant Run)

또는 다음과 같은 것을 사용하는 경우 :

    companion object {
        lateinit var instance: MyApp
    }

응용 프로그램 클래스와 그 자손이 컨텍스트이기 때문에 메모리 누수를 발견하지 않기 위해 보풀을 속이는 것만으로도 App 인스턴스가 여전히 메모리 누수를 일으킬 수 있습니다.

또는 기능 인터페이스 또는 기능 속성을 사용하여 앱 컨텍스트를 얻을 수 있습니다.

간단히 객체 클래스를 생성하십시오 :

object CoreHelper {
    lateinit var contextGetter: () -> Context
}

또는 nullable 유형을 사용하여보다 안전하게 사용할 수 있습니다.

object CoreHelper {
    var contextGetter: (() -> Context)? = null
}

그리고 App 클래스에서 다음 줄을 추가하십시오.


class MyApp: Application() {

    override fun onCreate() {
        super.onCreate()
        CoreHelper.contextGetter = {
            this
        }
    }
}

매니페스트에서 앱 이름을 . MyApp


    <application
            android:name=".MyApp"

컨텍스트를 얻으려면 간단히 전화하십시오.

CoreHelper.contextGetter()

// or if you use the nullable version
CoreHelper.contextGetter?.invoke()

그것이 도움이되기를 바랍니다.


이 핵심 헬퍼의 객체 클래스는 초기화되며 나중에 활동을 통해 사용할 수 있습니까? 죄송합니다. kotlin을 처음 사용합니다
— Dr. aNdRO

그렇습니다.
— Hayi Nukman

-1

이런 식으로 해보십시오

import androidx.appcompat.app.AppCompatActivity;  
import android.content.Context; 
import android.os.Bundle;

public class MainActivity extends AppCompatActivity {
    private static Context context;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        context = getApplicationContext();
    }

    public static void getContext(View view){
        Toast.makeText(context, "Got my context!",
                    Toast.LENGTH_LONG).show();    
    }
}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.