2012-01-03 1 views
1

SharedPreferencesが変更されたときにリモートサービスを更新したいです。以下は、APIレベル8(Android 2.2)での使用でした。アクティビティとリモートサービスの間でSharedPreferencesを共有できません - Androidのバグや機能?

私のアクティビティには、サービスバインダオブジェクトを介してリモートサービスを呼び出すOnPreferencesChangedListenerがあります。リモートサービスへのインタフェースは、リスナーによって呼び出されるメソッドprefsChanged(void)を提供します。その後、インターフェースメソッドは、アラートが何らかのアクションをトリガーする新しい時刻を計算します。 この時刻もSharedPreferencesに保存され、ブロードキャストが送信されます。ブロードキャストは私の活動によって受信され、新しいアラートタイムを表示できるようになりました。 アクティビティとリモートサービスは、SharedPreferencesオブジェクトを、PreferenceManager.getDefaultSharedPreferences(Context)と応答する静的メソッドGetPrefs(Context)を呼び出して取得します。

APIレベル15(Android 4.0.3)ではこれが機能しなくなりました。デバッグは、リモートサービスが異なる(古い?)値を保持している他のバージョンのSharedPreferencesを見ることを示します。 SharedPreferencesImplオブジェクトのログには、アクティビティとリモートサービスからのログ出力時に異なるアドレスが表示されます。ファイルシステムは、共有プリファレンスファイルを1つだけ表示します。

これはバグですか、私のコードはAPIレベル8でうまく動作しましたか? ご意見をお待ちしております。

答えて

8

答えはここにある、X90にTHX:https://stackoverflow.com/a/8723589/1127492

使用MODE_MULTI_PROCESSこれは、レガシー(ただし、文書化されていない)ジンジャーブレッド中と前行動(アンドロイド2.3)だったと、そのようなリリースを標的にする場合、このフラグが暗示されます。 Android 2.3以上のSDKバージョンを対象とするアプリケーションでは、このフラグを必要に応じて明示的に設定する必要があります。

0

ここでは、http://developer.android.com/sdk/api_diff/15/changes.html を検索し、アプリケーションで使用した変更されたパッケージを調べます。

+0

する必要があります私はすでに、私は行動の変更を説明するための何かを見つけることができませんでしたAPIレベル8と15との間の変更を検討しました。 – Stefan

+0

この質問も参照してください。http://stackoverflow.com/q/8714793/1127492 – Stefan

0

アプリをFroyoからICSにアップグレードするときに同じ問題が発生しました。 ICSからContext.getSharedPreferencesのソースコードによると、解決策がContext.MODE_MULTI_PROCESS

@Override 
public SharedPreferences getSharedPreferences(String name, int mode) { 
    SharedPreferencesImpl sp; 
    synchronized (sSharedPrefs) { 
     sp = sSharedPrefs.get(name); 
     if (sp == null) { 
      File prefsFile = getSharedPrefsFile(name); 
      sp = new SharedPreferencesImpl(prefsFile, mode); 
      sSharedPrefs.put(name, sp); 
      return sp; 
     } 
    } 
    if ((mode & Context.MODE_MULTI_PROCESS) != 0 || 
     getApplicationInfo().targetSdkVersion < android.os.Build.VERSION_CODES.HONEYCOMB) { 
     // If somebody else (some other process) changed the prefs 
     // file behind our back, we reload it. This has been the 
     // historical (if undocumented) behavior. 
     sp.startReloadIfChangedUnexpectedly(); 
    } 
    return sp; 
} 
関連する問題