現在、サービスの最終更新時刻をPrefenceに保存しています。
SimpleDateFormat sdf = new SimpleDateFormat("dd/MM HH:mm:ss");
String now = sdf.format(new Date());
Editor edit = PreferenceManager
.getDefaultSharedPreferences(this).edit();
edit.putString("lastUpdate", now);
edit.commit();
Log.i(this.getClass().toString(),"***** SERVICE: "+now+" *****");
// Done with our work... stop the service!
AlarmService_Service.this.stopSelf();
これはかなりうまく機能していますが、PrefenceActivityに表示したいときに問題が発生します。
実際、PreferenceActivityが最新の値を表示するには、アプリを強制的に停止する必要があるようです。
ここに1つの例があります:
アプリは20:50に開始されました
サービスは20:50に開始されました
=>PrefenceActivityは20h50を表示します...いいですね
21:00にサービスを開始
=>PrefenceActivityはまだ20h50を表示します!!!
サービスは21:10に開始されました
=>PrefenceActivityはまだ20h50を表示します!!!
その後、21:12、=>PrefenceActivityはまだ20h50を表示します!!!
21:12アプリを強制的に閉じて、もう一度開きます。
=> PrefenceActivityは最終的に最新の値を表示します(21:10)
何が起こっているのか本当にわかりません。サービス中にPrefenceが更新されていないようです!!!
public class PreferenceActivity extends SherlockPreferenceActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
addPreferencesFromResource(R.xml.preferences);
setSummaryAll(this.getPreferenceScreen());
}
private void setSummaryAll(PreferenceScreen pScreen) {
for (int i = 0; i < pScreen.getPreferenceCount(); i++) {
Preference pref = pScreen.getPreference(i);
updatePref(pref);
}
}
public void updatePref(Preference pref) {
if (pref instanceof ListPreference) {
final ListPreference listPref = (ListPreference) pref;
listPref.setOnPreferenceChangeListener(new OnPreferenceChangeListener() {
@Override
public boolean onPreferenceChange(Preference preference,
Object newValue) {
listPref.setSummary(listPref.getEntries()[listPref
.findIndexOfValue(newValue.toString())]);
return true;
}
});
pref.setSummary(listPref.getEntry());
} else if (pref instanceof EditTextPreference) {
Log.i("***", "EditTextPreference " + pref.getKey());
final EditTextPreference etPref = (EditTextPreference) pref;
etPref.setOnPreferenceChangeListener(new OnPreferenceChangeListener() {
@Override
public boolean onPreferenceChange(Preference preference,
Object newValue) {
etPref.setSummary(newValue.toString());
return true;
}
});
pref.setSummary(etPref.getText());
}
}
}