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


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.