2

出于某种原因,我的 android ContentObserver 被多次注册。ContentObserver 在我的主 Activity 中被定义为一个内部类。然后在我的 onCreate() 方法中实例化并注册它。

我认为 onCreate() 被多次调用,以及我的主要活动通常被多次实例化。为了防止这种情况,我尝试在我的 Android 清单中添加一个启动模式,但它似乎没有奏效:

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

在我的 onCreate 中注册之前,我也尝试过取消注册 Oberservers,但我认为因为它是我的主 Activity 的一个新实例,它没有做任何事情。

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

关于如何防止这种情况发生的任何想法?我还在我的主 Activity 中创建了一个可运行的和一个处理程序,我设置为定期运行,它遇到了同样的问题。理想情况下,修复程序也可以解决该问题。我很确定根本问题是我的主要 Activity 被实例化了不止一次,但是由于 launchMode 没有修复它,我不确定下一步该转向哪里。

任何帮助是极大的赞赏。谢谢

4

2 回答 2

1

您需要掌握根本问题,即Android Activity 生命周期 。如果需要,您可以使用 Singletons 解决其中的一些问题(我对此表示怀疑)。

于 2011-04-22T19:59:23.740 回答
1

用这个:

import android.database.ContentObserver;
import android.net.Uri;
import android.os.Bundle;
import android.os.Handler;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;

public class MyActivity extends AppCompatActivity {

    public static final Uri CONTENT_OBSERVER_URI = Uri.parse("content://example/system");
    private MyContentObserver myContentObserver;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        myContentObserver = new MyContentObserver(new Handler());
    }

    @Override
    protected void onResume() {
        super.onResume();
        getContentResolver().registerContentObserver(
                CONTENT_OBSERVER_URI, true, myContentObserver);
    }

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

    private class MyContentObserver extends ContentObserver {
        MyContentObserver(Handler handler) {
            super(handler);
        }

        @Override
        public void onChange(boolean selfChange) {
            super.onChange(selfChange);
            Log.d("MY_APP", "A content URI was changed");
        }
    }
}
于 2012-10-20T18:58:37.290 回答