2

何らかの理由で、私の Android ContentObserver が複数回登録されています。ContentObserver は、私のメイン アクティビティの内部クラスとして定義されています。その後、インスタンス化されて onCreate() メソッドに登録されます。

onCreate() が複数回呼び出されているだけでなく、メインのアクティビティが一般的に複数回インスタンス化されていると思います。これを防ぐために、Android マニフェストに launchMode を追加しようとしましたが、うまくいかないようです:

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

また、onCreate に登録する前に Oberserver の登録を解除しようとしましたが、メインのアクティビティの新しいインスタンスであるため、何もしないと思います。

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

これを防ぐ方法についてのアイデアはありますか? また、定期的に実行するように設定したメインのアクティビティで作成されたランナブルとハンドラーもあり、同じ問題が発生しています。理想的には、修正によってその問題も解決されます。根本的な問題は、メインのアクティビティが複数回インスタンス化されていることだと確信していますが、launchMode がそれを修正しなかったため、次にどこに向かうべきかわかりません。

どんな助けでも大歓迎です。ありがとう

4

2 に答える 2

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 に答える
1

Android アクティビティのライフサイクルである根本的な問題を把握する必要があります 。その後、必要に応じてシングルトンでこれに取り組むことができます (これは疑問です)。

于 2011-04-22T19:59:23.740 に答える