9

私はこの役立つ投稿を読みました:

SharedPreferences.onSharedPreferenceChangeListenerが一貫して呼び出されていない

しかし、私は運がありません。サービスで実行されるOnSharedPreferenceChangeListenerを作成しようとしています。すべてが正しく実装されていますが、リスナーが常にトリガーされるとは限りません。

public MyServiceOne extends Service {

    public SharedPreferences mSharedPreferences;

    // Listener defined by anonymous inner class.
    public OnSharedPreferenceChangeListener mListener = new OnSharedPreferenceChangeListener() {        

        @Override
        public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) {
            Log.d("debug", "A preference has been changed");            
        }
    };

    @Override
    public void onCreate() {            
        mSharedPreferences = getSharedPreferences(MySharedPreferences.NAME, Context.MODE_PRIVATE);
        mSharedPreferences.registerOnSharedPreferenceChangeListener(mListener);
    }

    @Override   
    public void onDestroy() {
        super.onDestroy();
        mSharedPreferences.unregisterOnSharedPreferenceChangeListener(mListener);
    }
}

アップデート

問題は私が言及しなかった事実から生じています。2つのサービスを実行していますが、MyService2で共有設定の変更が行われると、何もトリガーされません。マニフェストでは、さまざまなプロセスで実行するサービスを定義します。これを機能させる方法はありますか?

4

3 に答える 3

10

Androidの経験を積んだ後、私はこの質問に答え、この種の状況で問題を抱えている他の人を助けるために戻ってきました。

OnSharedPreferenceChangeListenerの実装は正しいです。問題は、マニフェストとアプリケーションのアーキテクチャにあります。サービスは異なるプロセスで実行されているため、Androidはサービスごとに異なるDalvik仮想マシンを作成しました。したがって、それらはお互いのリスナーを「聞く」ことはありません。

これは単に悪い設計でした。2つの同時サービスを実行するという考えにアプローチするためのより良い方法は、各「サービス」をスレッド化して同時に実行する1つのサービスを作成することです。このようにして、同じヒープを共有できるため、同じオブジェクトとリスナーを共有できます

誰かが2つのサービスを使用することを決定した場合、BroadcastReceiverを作成して、その設定を変更する必要があるというインテントをキャッチするか、ソケットを介して通信することができます。ContentProviderを使用してこれを行う方法もあります(これは絶対に行わないでください)。しかし、繰り返しになりますが、デザインが良ければ、これには理由がありません。

于 2012-03-01T14:38:08.070 に答える
0

サービスを実装させてみませんOnSharedPreferenceChangeListenerか?

そうすれば、匿名の内部クラスではないため、ガベージコレクションが行われず、サービスでやりたいことが何でもできます。

于 2011-11-01T14:37:39.227 に答える
0

私はこのスレッドが古いことを知っています。しかし、誰かがMODE_MULTI_PROCESSを使用してこれを試しましたか?

MODE_MULTI_PROCESS

于 2014-08-31T02:13:39.557 に答える