Android 라이브러리 프로젝트에서 애플리케이션의 컨텍스트를 가져올 수 있습니까?
내 라이브러리 프로젝트의 한 클래스 내에서 런타임에 내 라이브러리를 참조 / 호스팅 한 응용 프로그램의 컨텍스트를 얻고 싶습니다. 가능합니까? 그렇다면 어떻게?
감사
업데이트 내 라이브러리 프로젝트가 JNI를 통해 호출 될 수 있고 JNI에서 컨텍스트를 가져와 Java 계층에 전달할 수있는 방법을 모르기 때문에 내 사용자가 내 라이브러리 프로젝트에 매개 변수의 컨텍스트를 전달하는 것을 원하지 않습니다.
가능합니까?
예.
그렇다면 어떻게?
매개 변수로 전달하십시오.
내 라이브러리 프로젝트가 JNI를 통해 호출 될 수 있고 JNI에서 컨텍스트를 가져와 Java 계층에 전달할 수있는 방법을 모르기 때문에 내 사용자가 내 라이브러리 프로젝트에 매개 변수의 컨텍스트를 전달하는 것을 원하지 않습니다.
그런 다음 "[당신]이 JNI에서 컨텍스트를 가져 와서 Java 계층에 전달하는 방법"을 파악하십시오. 나는 당신이 다른 물건처럼 그것을 전달할 것이라고 상상할 것입니다. @Blundell이 언급했듯이 실제로 다른 옵션이 없습니다.
한 가지 더 방법이 있습니다. 라이브러리 프로젝트에 애플리케이션 클래스를 추가하는 것입니다.
/**
* Base class for those who need to maintain global application state.
*/
public class LibApp extends Application {
/** Instance of the current application. */
private static LibApp instance;
/**
* Constructor.
*/
public LibApp() {
instance = this;
}
/**
* Gets the application context.
*
* @return the application context
*/
public static Context getContext() {
return instance;
}
}
그런 다음 일반 프로젝트에서 실제 애플리케이션 클래스가 LibApp을 확장하도록합니다.
/**
* Base class for those who need to maintain global application state.
*/
public class App extends LibApp {
@Override
public void onCreate() {
super.onCreate();
}
}
AndroidManifest에 "이름"이 정의되어 있는지 확인하십시오.
<application android:name="App" ...>
App 클래스가 기본 패키지에 있습니다.
그런 다음 라이브러리 프로젝트에서 LibApp.getContext ()를 사용하여 라이브러리를 사용하는 애플리케이션의 애플리케이션 컨텍스트를 가져올 수 있습니다.
이것은 좋은 해결책이 아닐 수도 있지만 저에게는 효과적입니다. 다른 사람에게 유용 할 수 있기 때문에 공유하고 있습니다.
There's another way to get context in jni, neither passing a parameter nor saving context by yourself, but by using android api. I found that there's a class named:
- android.app.AppGlobals
in the source code. And the static function
getInitialApplication
can return an
Application
object. But it must be called in main thread, and the class is hidden. Anyway you can use it by reflecting in java. And you can just useFindClass()
andFindStaticObjectMethod()
to find out the method, and use it. Hope that helps.
In your library project add a dependency to your main project. In IntelliJ it will do it for you when you try to reference this global variable. In Eclipse I am not sure...
I would pass it as a parameter or pass it a singleton in that library.
Having the main app application extend the library's application class is a bad idea coz in java you can only extend once from a class. If your application requires to pass to another library you will be in trouble.
According to this post you can let the library auto-initialize itself with the application context by the aid of a ContentProvider
.
Be careful anyway, as described in the post comments, there may be drawbacks concerning loading time and instant run, as well as crashes on multi-process apps.
HTH
'IT박스' 카테고리의 다른 글
자바 플러그인 프레임 워크 선택 (0) | 2020.12.09 |
---|---|
PDO에서 오류 메시지를 압축하는 방법은 무엇입니까? (0) | 2020.12.09 |
배치 파일 : 상대 경로가있는 디렉토리의 모든 파일 나열 (0) | 2020.12.09 |
Django의 GenericForeignKey를 모델 목록으로 제한하려면 어떻게해야합니까? (0) | 2020.12.08 |
컨텍스트가없는 클래스에서 getResources ()를 호출하는 방법은 무엇입니까? (0) | 2020.12.08 |