2011-04-22 3 views
0

몇 가지 이유로 안드로이드 ContentObserver가 여러 번 등록되고 있습니다. ContentObserver는 내 주요 활동의 내부 클래스로 정의됩니다. 그런 다음 내 onCreate() 메소드에 인스턴스화되고 등록됩니다.Android ContentObserver를 여러 번 등록하지 못하도록

나는에서 onCreate()를 여러 번 인스턴스화하는 것을 일반적으로 여러 번뿐만 아니라 내 주요 활동을 호출되고 있다고 생각합니다. 이를 방지하기 위해, 내 안드로이드 매니페스트에 launchMode를 추가 해봤지만 근무하지 않는 것 :

<activity android:name=".MainActivity" 
    android:label="@string/app_name" 
    android:launchMode="singleInstance"> 

나는 또한 내에서 onCreate에 등록하기 전에 Oberservers 등록을 취소하려했지만, 내가 있기 때문에 생각 그것은 내 주요 활동의 새로운 인스턴스입니다. 아무 것도하지 않습니다.

public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 

    this.contentResolver = this.getApplicationContext().getContentResolver(); 
    this.myObserver = new MyObserver(this.contentResolver); 

    this.contentResolver.unregisterContentObserver(this.myObserver); 
    this.contentResolver.registerContentObserver(MainActivity.myObserveUri, true, this.myObserver); 
} 

private class MyObserver extends ContentObserver { 
    public MyObserver(ContentResolver contentResolver) { 
     super(null); 
     //My Code 
    } 
} 

어떻게 이런 일이 발생하지 않도록 할 수 있습니까? 또한 주기적으로 실행되도록 설정된 주요 활동에 실행 파일과 처리기가 만들어져 동일한 문제가 발생합니다. 이상적으로는 문제가 해결 될 수도 있습니다. 근본적인 문제는 내 주 활동이 한 번 이상 인스턴스화되었다는 것이 확실하지만 launchMode가 문제를 해결하지 못했기 때문에 다음에 어디로 향할 지 잘 모르겠습니다.

도움을 주시면 대단히 감사하겠습니다. 감사합니다

답변

1

Android Activity lifecycle 인 기본 문제를 파악해야합니다. 그러면 필요한 경우 싱글 톤으로이 문제를 해결할 수 있습니다 (의심 스럽습니다).

+0

무기한 실행하고, 내가 마무리를 호출하지 않습니다. 즉, 시스템이 일시적으로 이전 활동을 파괴하는 경우 새로운 활동이 생성되는 유일한 방법일까요? 그렇다면 onDestroy()에서 내 ContentObserver를 등록 취소 한 다음 잠시 후 onCreate()에 다시 등록 할 수 있다고 생각합니다. 이게 효과가 있니? 저는 처음 관찰자를 지키고 추가 관찰자를 만들지 않기를 원합니다. – Colin

+0

매우 광범위한 주제 ... onDestroy()/onCreate()는 다양한 이유로 인해 발생합니다 (가로/세로 이동 (앱/뷰에서 허용하는 경우), OS 메모리 교정 ... 정말 알아야 할 것은 기본 프레임 워크. – Dan

3

사용이 : 내 주요 활동에() 관찰자가 의미

@Override 
protected void onCreate() 
{ 
    myObserver = new MyObserver(contentResolver); 
    getContentResolver().registerContentObserver(
     MainActivity.myObserveUri, true, myObserver); 
} 

@Override 
protected void onPause() 
{ 
    getContentResolver().unregisterContentObserver(myObserver); 
} 

@Override 
protected void onResume() 
{ 
    getContentResolver().registerContentObserver(
     MainActivity.myObserveUri, true, myObserver); 
} 
+1

이 코드도 2 번 등록하지 않습니까? – Farhan

+0

onResume에서 이미 완료되었으므로 onCreate에 등록 할 필요가 없습니다. – Tiago