13

SharedPreferences の文字列を更新するアクティビティがあります。

SharedPreferences settings = PreferenceManager.getDefaultSharedPreferences(this);
SharedPreferences.Editor editor = settings.edit();
editor.putString("username", username);
editor.commit();

次に、サービスを開始します。

startService(new Intent(this, MyService.class));

このサービスは、BroadcastReceiver を拡張する Alarm への参照を作成します。

Alarm alarm = null;
public void onCreate() {
    alarm = new Alarm();
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
    alarm.SetAlarm(this);
}

SetAlarm では、すべての基本的な設定を行います (この時点では、「ユーザー名」はまだ正しいです..確認しました):

public void SetAlarm(Context context) {
    AlarmManager am=(AlarmManager)context.getSystemService(Context.ALARM_SERVICE);
    PendingIntent pi = PendingIntent.getBroadcast(context, 0, i, 0);
    am.setRepeating(AlarmManager.ELAPSED_REALTIME_WAKEUP, SystemClock.elapsedRealtime(), 1000 * 60 * interval, pi);
}

次に、サービスを停止してから再開します (SetAlarm を使用)。

public void CancelAlarm(Context context) {
   Intent intent = new Intent(context, Alarm.class);
   PendingIntent sender = PendingIntent.getBroadcast(context, 0, intent, 0);
   AlarmManager alarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
   alarmManager.cancel(sender);
}

問題は onReceive にあります。最初は「ユーザー名」フィールドが正しいです。ただし、サービスの停止と開始の間にユーザー名が更新された場合、2 回目は最初の値を返します。値が更新されないようです...

public void onReceive(Context context, Intent intent) {   
    SharedPreferences settings = PreferenceManager.getDefaultSharedPreferences(context);
    Log.e("hi", settings.getString("username", ""));
}
4

2 に答える 2

67

私は同じ問題を抱えていて、それを解決するために何時間も苦労した後、私はついにそれを引き起こしている問題を見つけました。AndroidManifestには、おそらく次のようなものがあります。

<receiver android:name="AlarmReceiver" android:process=":remote" />

最後の属性(process:remote)により、レシーバーは呼び出されたときに別の/新しいプロセスで実行されます。ただし、SharedPreferencesは異なるプロセス間ではサポートされていません。

だから私がしたことは、マニフェストからその最後の属性を削除することです。これは、コードがメインスレッドで実行されることを意味しますが、通知を表示する行が数行しかない場合は、問題にはなりません。もう1つの方法は、サービスを呼び出して長い操作を実行することです。

于 2012-05-26T22:10:37.027 に答える