2011-04-22 41 views
0

出於某種原因,我的Android ContentObserver被多次註冊。 ContentObserver在我的主Activity中被定義爲內部類。然後在我的onCreate()方法中實例化並註冊。停止Android ContentObserver多次註冊

我認爲,多次調用onCreate(),以及我的主要活動一般被多次實例化。爲了防止這種情況,我已經試過加入launchMode我的Android清單,但它似乎並沒有工作過:

<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 
    } 
} 

有關如何防止這種情況發生的任何想法?我還有一個runnable和一個在我的主Activity中創建的處理程序,我已經設置了定期運行,這也遇到了同樣的問題。理想情況下,修復也可以解決這個問題。我很確定,潛在的問題是我的主要Activity不止一次實例化,但由於launchMode沒有修復它,我不確定接下來要轉向哪裏。

任何幫助,非常感謝。謝謝

回答

1

你需要掌握的基本問題,這是Android Activity lifecycle 然後,你可以解決一些與單身人士,如果需要(我懷疑)。

+0

觀察員是爲了我的主要活動無限期地運行下去,我從來沒有調用finish()。這是否意味着創造新活動的唯一方式是系統是否暫時摧毀舊系統?如果是這樣,我想我可以在onDestroy()中取消註冊我的ContentObserver,然後不久之後它將在onCreate()中重新註冊。這會工作嗎?我想我寧願保留我的初始觀察員,並停止創建其他人。 – Colin 2011-04-22 20:17:42

+0

非常廣泛的主題... onDestroy()/ onCreate()出現各種原因 - 橫向到縱向移動(如果您的應用程序/視圖允許),操作系統內存回收... 你真的需要知道底層框架。 – Dan 2011-04-22 20:21:50

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 2014-04-16 10:01:54

+0

在onCreate上註冊不是必需的,因爲它已經在onResume上完成了。 – Tiago 2014-12-12 03:51:25