Android는 라이브러리 프로젝트를 도입 한 이후로, 앱을 라이브러리로 변환하여 적절한 수정이 가능한 여러 버전을 만들 수있게되었습니다 (예 : 무료 및 프로 버전 코드베이스,하지만 몇 가지 변경).Android 라이브러리에서 비 도서관 코드 호출하기
처음에는 라이브러리 프로젝트의 코드가 내 서브 프로젝트의 필드에 액세스하는 것을 허용하지 못했습니다. 즉, 무료 및 프로 버전에는 라이브러리 프로젝트가 특정 기능을 구별하는 데 사용할 몇 가지 상수가있는 클래스가있었습니다.
하위 프로젝트에서 라이브러리의 기본 활동을 확장하고 리플렉션을 사용하여 라이브러리의 필드 값을 변경하는 정적 초기화 블록을 추가했습니다.
public class MyMainActivityProVersion extends MyMainActivity {
public static final String TAG = Constants.APP_NAME + "/SubClass";
static {
try {
ConstantsHelper.setConstants(Constants.class);
} catch (Exception e) {
Log.d(TAG, "--- Constants not initialised! ---");
e.printStackTrace();
}
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
}
}
이 코드에서 ConstantsHelper는 라이브러리에 있으며 내 하위 프로젝트에서 Constants.class를 제공하고 있습니다. 이렇게하면 라이브러리 프로젝트의 상수가 초기화됩니다.
하나의 특별한 사용 사례를 제외하고는 내 접근 방식이 훌륭하게 작동합니다. 응용 프로그램이 잠시 동안 사용되지 않고 OS에 의해 '중지'되면 ConstantsHelper의 정적 필드는 잊어 버리게됩니다.
상수는 주 활동 (위 그림 참조)에 의해 재설정되지만 운영 체제는 다른 활동을 다시 시작하기 때문에 주 활동이 실행되지 않습니다. 이것의 결과는 상수의 초기화가 잊혀지고 재개 된 활동이 라이브러리 (서브 프로젝트에 대한 지식이없는)에 있기 때문에 다시 초기화 할 수 없다는 것입니다.
어떻게하면 라이브러리의 다른 활동에서 재개 할 때 하위 프로젝트의 코드를 호출 할 수 있습니까? 또는 하위 프로젝트의 일부 코드가 모든 이력서에 호출되도록하는 방법이 있습니까?
나는 클래스 로더의 관점에서 어떤 일이 일어 났는지 설명 할 수는 있을지 모르지만 아직 완전히 이해하지 못했다. '도서관에서 재개 된 활동'이란 무엇을 의미합니까? 그것은 당신의 앱에있는'MyMainActivityProVersion'입니다. 그리고 상수가 잊혀진 것은 무엇을 의미합니까? –
MyMainActivity는 다른 활동 (이 경우에는 ViewerActivity)을 호출하여 라이브러리 프로젝트에 상주합니다. 사용자가 ViewerActivity에서 'home'을 누르면 응용 프로그램이 결국 종료되고 ConstantsHelper의 상수를 다시 초기화해야합니다. 사용자가 앱을 다시 시작할 때 다시 시작된 활동은 ViewerActivity이고 위의 중요한 코드는 실행되지 않기 때문에 다시 초기화되지 않습니다 – HXCaine
그래서 상수 값은 ProVersionActivity를위한 것이 아닙니다. Application 클래스에 대해 알고 있습니까? 시작된 "하위 활동"에 관계없이 한 번 생성됩니다. – thaussma