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