1

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의 정적 필드는 잊어 버리게됩니다.

상수는 주 활동 (위 그림 참조)에 의해 재설정되지만 운영 체제는 다른 활동을 다시 시작하기 때문에 주 활동이 실행되지 않습니다. 이것의 결과는 상수의 초기화가 잊혀지고 재개 된 활동이 라이브러리 (서브 프로젝트에 대한 지식이없는)에 있기 때문에 다시 초기화 할 수 없다는 것입니다.

어떻게하면 라이브러리의 다른 활동에서 재개 할 때 하위 프로젝트의 코드를 호출 할 수 있습니까? 또는 하위 프로젝트의 일부 코드가 모든 이력서에 호출되도록하는 방법이 있습니까?

+0

나는 클래스 로더의 관점에서 어떤 일이 일어 났는지 설명 할 수는 있을지 모르지만 아직 완전히 이해하지 못했다. '도서관에서 재개 된 활동'이란 무엇을 의미합니까? 그것은 당신의 앱에있는'MyMainActivityProVersion'입니다. 그리고 상수가 잊혀진 것은 무엇을 의미합니까? –

+0

MyMainActivity는 다른 활동 (이 경우에는 ViewerActivity)을 호출하여 라이브러리 프로젝트에 상주합니다. 사용자가 ViewerActivity에서 'home'을 누르면 응용 프로그램이 결국 종료되고 ConstantsHelper의 상수를 다시 초기화해야합니다. 사용자가 앱을 다시 시작할 때 다시 시작된 활동은 ViewerActivity이고 위의 중요한 코드는 실행되지 않기 때문에 다시 초기화되지 않습니다 – HXCaine

+0

그래서 상수 값은 ProVersionActivity를위한 것이 아닙니다. Application 클래스에 대해 알고 있습니까? 시작된 "하위 활동"에 관계없이 한 번 생성됩니다. – thaussma

답변

0

나는이 질문에 대한 좋은 대답을 결코 발견하지 못했습니다. 아마 내 끔찍한 반성의 사용을 계속하고 해킹 된 해결 방법을 찾아 낼 것이다.

나는이 페이지로 오는 다른 사람들의 이익을 위해이 문제를 해결하지 못했다는 것을 지적했다.

0

정적 멤버를 통해 두 가지 액티비티간에 데이터를 공유하려고하면 "속이는 것"이라고 생각합니다. 이는 동일하거나 관련된 클래스 로더에있을 때 작동합니다. 여기 안드로이드는 별도의 활동을 위해 별도의 클래스 로더를 사용하지만 하위 활동은 하위 클래스 로더에 있다고 생각합니다. 따라서 ViewActivity은 부모 클래스 로더를보고 부모에 대한 통계를 볼 수 있습니다. 나중에 나는 부모가 없어 졌다고 믿기 때문에, 다음에 자녀가 접근 할 때 자녀가 MyMainActivity을 다시로드하고 원하는대로 초기화되지 않았습니다. (글쎄, 그렇지 않다면이 설명과 매우 흡사합니다.)

나는 좀 더 강력한 대안이 있다고 생각합니다. LicenseChecker API를 사용하여 활동 라이프 사이클 및 클래스 로더의 세부 사항에 의존하지 않고 무료 버전인지 유료 버전인지 결정할 수 있습니다. 다른 유형의 무단 사용으로부터 사용자를 보호하므로 아마 더 나을 것입니다.

+0

상황을 잘못 이해했을 수 있습니다. 텍스트 설명을 읽는 것은 어렵다). 저는 정적 멤버들을 액티비티에서 공유하지 않고, 서브 - 액티비티의 활동에 의해 유용한 정보로 채워지는 라이브러리의 상수 클래스를 통해 공유됩니다. 그런 다음 모든 도서관 활동에 액세스 할 수 있습니다. 그러나 OS에서 응용 프로그램을 종료하면 상수 클래스가 초기화되지 않고 라이브러리 프로젝트를 가져 와서 하위 프로젝트와 그 안에있는 코드를 '볼'수있는 방법이 없습니다. 상수. 그게 내 문제 야. – HXCaine

+0

나는 오해 할 수도 있지만, 당신이 묘사하고있는 것은 여전히 ​​당신이 객체 나 인스턴스가 아닌 클래스 자체와 관련된 것에 의지하는 것처럼 들린다. 클래스는 "초기화 할 수 없습니다."-하지만, 나는 새로운 클래스 로더에서 다시 클래스를 다시로드하거나, 내가 부여한 이유 때문에 새로운 싱글 톤 또는 무언가를 만드는 것으로 끝날 수는 있습니다. 그것은 여전히 ​​청어가 될 수 있습니다 - 코드를보아야 할 것입니다 -하지만이 아이디어가 관련성이 있는지 여부를 명확하게 밝혀줍니다. –

0

Android 리소스를 사용하여 해결할 수 있습니다. 기본적으로 라이브러리 프로젝트의 리소스 xml 값 파일에 상수를 정의하십시오.
예 : "lib 프로젝트"\ 값 \ 상수.
일예 : 다른 자원 XML 값 파일을 사용하여 LIB 프로젝트 값을 다시 정의 할 수 있습니다 귀하의 하위 프로젝트에

<resources xmlns:tools="http://schemas.android.com/tools"> 
    <bool name="const_free_version">false</bool> 
    <string name="const_a_constant">pippo</bool> 
</resources> 

그런 다음, XML

당신의 lib 디렉토리 프로젝트 코드에서 "하위 프로젝트"\ 값 \ constants.xml

<resources xmlns:tools="http://schemas.android.com/tools"> 
    <bool name="const_free_version">true</bool> 
</resources> 

당신은 당신이 하위 프로젝트 상수 값의 XML을 기반으로 실제 값을 얻을 R.bool.const_free_version를 참조 할 때.
lib 프로젝트 constants.xml에 정의 된 모든 값을 다시 정의 할 필요는 없지만 하위 프로젝트에서 다르게 필요한 값만 재정의 할 수 있습니다.