2012-12-31 3 views
1

내 App의 SettingsActivity를 만들었습니다. 이 Activity에서 사용자가 편집 가능한 환경 설정을 처리하기 위해 SharedPreferences 클래스를 사용하고 있습니다.putExtra가 새로운 활동으로 데이터를 전달하는 유일한 방법입니까?

SharedPreferences을 설정하는 동안 내 기본 활동의 onCreate에로드 한 다음 다시 SettingsActivity에로드해야합니다. 아마도 getXXXX() 메서드에 대한 호출은 모두 기본값을 필요로하므로 기본값을 두 위치로 모두 하드 코딩하는 것이 좋지 않을 것이라고 생각했습니다. 나중에 변경하면 문제가 될 것이라고 생각하기 때문입니다.

이 작업을 수행하는 데 가장 많이 사용되는 표준은 무엇입니까?

  • 각 활동으로 가져 와서 내 기본 상수를 정의하는 전역 변수 클래스를 만드시겠습니까?

  • putExtragetExtra을 사용하여 주 활동에서 설정 활동으로 데이터를 전달 하시겠습니까?

다른 제안 사항이 있습니까?

+2

첫 번째 옵션이 좋은 해결책이라고 생각합니다. 중앙 집중식 클래스에서'public static final' 변수를 사용하는 것은 다른 클래스들이 공유 할 수있는 상수 값을 제공하는 자바 관용구입니다. –

답변

3

내가 Squonk 좋은 답을 가지고 있다고 생각하지만, 대안을 찾는 경우, 회원 등의 모든 설정과 함께 Settings 클래스를 만드는 것이 좋습니다 . 과 같은 정적 메서드를 사용하면 개체를 SharedPreferences에서 생성하고, 필요한 기본값을 사용하여 반환 할 수 있습니다. 수정 사항을 저장하는 방법은 saveSettings(Context) 일 수도 있습니다. 희망이 도움이됩니다.

-2

개체를 public static으로 선언하고 다른 클래스에서 참조 할 수 있습니다.
ActivityA
:

public static int testIntegerA = 42; 

Intent intentInteger = new Intent(getActivityContext(), ActivityB.class); 
intentInteger.putExtra("INTENT_EXTRA", testIntegerA); 
startActivity(intentInteger); 

ActivityB : 지금

public static int intentInt, staticInt; 

staticInt = ActivityA.testIntegerA; 
intentInt = getIntent().getExtras().getInt("INTENT_EXTRA"); 

모두 intentInt과 동일 staticInt 42;

+0

좋은 디자인 모델이 아닙니다. 안드로이드'Activity' 클래스가 전역 변수를 유지하는 데 사용될 필요가있는 곳을 생각할 이유가 없습니다. – Squonk

+0

선형 탐색 기능이있는 앱이 있고 각 앱에서 사용되는 변수가있는 경우 전자 메일의 내용 (각 활동이 메시지를 변경하기 전에 다음 활동으로 전달하기 전에 메시지 내용이 변경됨)을 추가로 변경하면이 방법 단어 벌금. – Adam

+0

"선형 탐색"은 어떻게 정의합니까? 또한 안드로이드 디자인은 특정 목적을 위해' '를 등록하면 외부 앱이 타사 앱의 구성 요소를 시작할 수 있도록 허용합니다. PDF 뷰어를 포함하고 PDF MIME 형식에 대해 'ACTION_VIEW'를 등록하는 앱을 만든다고 가정 해 보겠습니다. 그러면 앱에서 PDF 파일을 볼 필요가 있고 '활동'이 시작되지만 내 앱에서 다른 '활동'의 '정적'입력란에 액세스해야합니다. 왜 내 PDF 뷰어 'Activity'는 앱의''계약을 이행하기 위해 다른'Activity'의'정적'멤버에 액세스해야합니까? – Squonk

1

개인적으로이 상황에서는 리소스 파일에 기본값을 넣었습니다. 그런 식으로 전역 변수 클래스 또는 도우미 클래스를 사용할 필요가 없습니다. Android 리소스가 이미이를 지원합니다.

참조 :

Providing resources

More resource types

+0

이것은 믿을 수 없을만큼 간단한 해결책처럼 보입니다. 시도해 볼게. –

+0

@JimThornton : 참으로. 그리고 데이터 타입이'String' (예를 들어)이라면 다른'/ res/values-xx' 디렉토리 (xx는 국가/언어 코드)를 생성하여 지역화를 사용할 수 있습니다. 그리고 OS는 자동으로 올바른 것을 선택합니다 . – Squonk

+0

설정에 코드에서 계산 된 기본값이 필요할 경우 문제가 다시 발생합니다. – marcinj

0

정적 값이있는 클래스를 사용하는 대신 왜 응용 프로그램 클래스가 확장되어 응용 프로그램 프로세스가 실행될 때 항상 살 수 있습니까?

0

두 활동의 onCreate에서 SharedPreference를 열 것을 적극 권장합니다. 전역 변수를 사용하려고 할 때마다 값은 감지 및 수정하기가 어려운 방식으로 사라집니다. 활동은 닫힐 때 파괴됩니다. 서비스는 언제든지 메모리에서 제거 할 수 있습니다. 서비스가 잠자기 상태이고 메모리에 활동이없는 경우 애플리케이션 컨텍스트가 삭제됩니다.

즉, 응용 프로그램 컨텍스트에 변수를 두는 것이 가장 좋은 방법이라고 할 수 있습니다. Application을 확장하는 클래스를 만들고 이것을 사용하도록 AndroidManifest.xml을 설정하십시오. 서비스 또는 브로드 캐스트 리시버에서이 값을 사용하려고하면 값이 존재하지 않을 것입니다.

또한 너무 느리게로드되는 활동에 문제가없는 경우 최적화보다 기능을 사용하는 것이 좋습니다.

+0

현재 두 활동의 onCreate에 SharedPreferences가 있습니다. 그러나 이것은 내 문제를 일으키는 것으로 보인다. 논리적으로 생각하면 각 getXXXX() 메서드에 기본값을 하드 코딩하면 문제가 될 것이므로 더 나은 방법이 있어야한다고 생각했습니다. 이것은 내 코드를 최적화하는 것과 "올바른"또는 "받아 들인"방법을 배우는 것에 대한 것보다 적습니다. 네가 일할 수있는 방법은 많이 있지만, 배운 이래로 나는 처음부터 효율적으로하는 법을 배우는 것이 낫다고 생각한다. –

관련 문제