2011-04-22 81 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