11

SharedPreferences を使用して、アプリケーションのさまざまなアクティビティ内で値を書き込み、後で読み取ります。以前は問題なく動作していましたが、最近は罪悪感がなければうまくいくようです。つまり、値を書き込みますが、他のアクティビティはまだ古い値を読み取ります。時々それは正しく動作します。何か案が?

編集:これはサンプルコードです:

まず、スレッドから:

SharedPreferences prefs = getSharedPreferences("MyPrefs", Context.MODE_PRIVATE);
SharedPreferences.Editor editor = prefs.edit();
editor.putInt("ComandToDo", value);
editor.commit();
... some code later:
alarmmanager.set(AlarmManager.RTC_WAKEUP, Miliseconds, sender);

アラーム受信機で:

SharedPreferences prefs = contexto.getSharedPreferences("MyPrefs", Context.MODE_PRIVATE);
int value = prefs.getInt("ComandToDo", -1);    

「値」はスレッドに書き込まれた値ではないため、ここで問題が発生します。

4

4 に答える 4

6

これが私が遭遇したものであり、それを修正するために私がしたことです。

アクティビティからアラームをトリガーしていて、そのアラームの Broadcast-Receiver で、アプリが起動されるたびに読み取られる Shared-Preferences を更新していました。

アラームがトリガーされた後、アプリが起動されるたびに、そのアクティビティからのみ設定された古い値が取得されます。Broadcast-Receiver からの変更は反映されていません。

ここでの秘訣は、Shared-Preferences をMODE_MULTI_PROCESSとして設定することです

通常は MODE_PRIVATE を使用しますが、次のようにします。

SharedPreferences prefs = this.getSharedPreferences("Preferences", MODE_MULTI_PROCESS);

注: コードでモードを変更した後、デバッグ中の問題を回避するために、アプリのデータをクリアすることをお勧めします。

編集: MODE_MULTI_PROCESS には最低 API 11 が必要

API 11 より前に考えられる回避策は、2 つの列 KEY と VALUE を持つデータベースを作成することです。これは、他のモジュールからアクセスできます。

于 2014-04-14T06:22:18.993 に答える
3
  1. SharedPreferences は、プロセス間で機能しないことが文書化されています

  2. この回答では、データをコンテンツ プロバイダーにカプセル化することを推奨しています。ディスカッションでは、共有 SQLite を含む他のオプションも検討しています: https://stackoverflow.com/a/5265556/1665128

  3. また、ファイル システムには単純な古いファイルもあります。ロックを使用して、問題なくいくつかのプロジェクトでそれらを使用しました。あなたにとっても選択肢になるかもしれません。

于 2013-01-02T21:22:24.863 に答える
0

BroadcastReceiverの代わりにIntentServiceを使用してください。それは私のための仕事です。

サービスクラス:

public class ServiceClass extends IntentService {

    public NotificationPopupService(String name) {
        super(name);
    }

    public NotificationPopupService(){
        super("YOU_DEFAULT_NAME");
    }

    @Override
    protected void onHandleIntent(Intent intent) {
        SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(getApplicationContext());

        do magic...
    }
}

アプリケーションタグの AndroidManifest.xml ファイル:

<service android:name="ServiceClass"/>

アラームを作成:

intent = new Intent(context, ServiceClass.class);
pendingIntent = PendingIntent.getService(context, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);
// magic after 2 seconds after the creation of alarm
alarmManager.set(AlarmManager.RTC_WAKEUP, System.currentTimeMillis() + 2000, pendingIntent);
于 2014-08-10T08:11:52.407 に答える
0

「MyPrefs」設定ファイルに書き込み、「PerfilDeSonidoPreferencias」ファイルから読み取ろうとしています。同じ設定ファイルから読み書きしてください。

于 2013-01-02T22:55:54.413 に答える