0

現在、サービスの最終更新時刻を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());
        }
    }
}
4

1 に答える 1

3

私が書いた: android:process=":remote"

それがあなたの困難の源です。SharedPreferences値はプロセスごとにキャッシュされ、あるプロセスは別のプロセスの変更を認識しません。

削除してもアプリに影響がない場合

これは、アプリが消費する RAM が少なくなり、場合によっては CPU が少なくなることを意味します。通常、アプリに複数のプロセスは必要ありません。

于 2012-11-21T19:56:50.867 に答える