停止多次注册Android ContentObserver

停止多次注册Android ContentObserver,android,contentobserver,Android,Contentobserver,出于某种原因,我的android ContentObserver被注册了多次。ContentObserver在我的主要活动中被定义为一个内部类。然后在我的onCreate()方法中实例化并注册它 我认为onCreate()被多次调用,我的主要活动通常被多次实例化。为了防止出现这种情况,我尝试在我的Android清单中添加一个launchMode,但它似乎不起作用: <activity android:name=".MainActivity" android:label="@stri

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

我认为onCreate()被多次调用,我的主要活动通常被多次实例化。为了防止出现这种情况,我尝试在我的Android清单中添加一个launchMode,但它似乎不起作用:

<activity android:name=".MainActivity"
    android:label="@string/app_name"
    android:launchMode="singleInstance">
有什么办法可以防止这种情况发生吗?我还在我的主活动中创建了一个runnable和一个handler,我已将其设置为定期运行,这遇到了相同的问题。理想情况下,修复也可以解决这个问题。我很确定潜在的问题是我的主要活动被实例化了不止一次,但是由于launchMode没有修复它,我不确定下一步该转到哪里


非常感谢您的帮助。谢谢

您需要抓住根本问题,即 如果需要的话(我怀疑这一点),您可以使用单例解决一些问题。

使用以下方法:

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");
        }
    }
}

观察器是无限期运行的,我从不调用主活动的finish()。这是否意味着创建新活动的唯一方式是系统临时销毁旧活动?如果是这样,我想我可以在onDestroy()中注销我的ContentObserver,然后不久它就会在onCreate()中重新注册。这样行吗?我想我更愿意保留我最初的观察者,并阻止其他观察者被创建。非常广泛的话题。。。onDestroy()/onCreate()的出现有多种原因——从横向移动到纵向移动(如果您的应用程序/视图允许),操作系统内存回收。。。您确实需要了解底层框架。无需在onCreate上注册,因为它已在onResume上完成。@Farhan,Tiago:我已澄清了在活动处于活动状态时(onResume)注册内容观察者一次,并在活动处于非活动状态时(onPause)注销内容观察者的代码
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");
        }
    }
}