私はAndroidマーケットで公開されたappwidgetsをいくつか持っており、ほとんどの場合うまく動作します。しかし、共有設定を使用して保存された設定がデフォルトにリセットされることがあります。この場合のデフォルトは、ハードコードされた変数です。 xmlに保存された共有設定は、ユーザが保存したのと同じままです。Android appwidgetは時々設定をデフォルトに戻します
確認可能なケースでは、上記の問題と、デバイスの再起動後に応答を停止するボタンなどの他の問題が発生しました。すなわち
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED"/>
</intent-filter>
BroadcastReceiverは素晴らしい働きリブート、後に実行されます。私は、マニフェストにインテントフィルタによって活性化されるonReceive()メソッドを持っているBroadcastReceiverを作成することによって、その固定されています。
ただし、デバイスによっては環境設定がリセットされることがあります。これは、夜間などスタンバイ状態になった後に発生します。私はデバイスが(しばらくしてから、スタンバイになるために)appwidgetを再起動する可能性があるため、これが疑わしいです。私はBroadcastReceiverの一環として、マニフェストに以下を追加することにより、それを解決しようとした:
<intent-filter>
<action android:name="android.intent.action.PACKAGE_RESTARTED"/>
</intent-filter>
全セクションは、読み取ります
<receiver android:name=".BroadcastReceiverName">
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED"/>
</intent-filter>
<intent-filter>
<action android:name="android.intent.action.PACKAGE_RESTARTED"/>
</intent-filter>
</receiver>
しかし、これは動作するようには思えません。
私はこの問題の原因となる可能性があることを知りたいのですが、アプリでどのように検出して対応することができますか。つまり、BroadcastReceiverを起動して設定を再読み込みしてください。ここで完全に期すため
は(作業)BroadcastReceiverコードの一部ですが、私は好みを保存しService does not restart after "Clear Memory" + appWidget crashes
public class BroadcastReceiverName extends BroadcastReceiver
{
@Override
public void onReceive(Context context, Intent intent)
{
/* stuff done here to reread shared preferences and refresh button's pending intents etc. */
SharedPreferences config=context.getSharedPreferences(ExampleWidgetConfig.PREFS_NAME, 0);
int poll=config.getInt(ExampleWidgetConfig.PREFS_UPDATE_RATE, ExampleWidgetProvider.poll);
int alert=config.getInt(ExampleWidgetConfig.PREFS_ALERT, ExampleWidgetProvider.alert);
int backg=config.getInt(ExampleWidgetConfig.PREFS_BACKG, ExampleWidgetProvider.backg);
/* change hardcoded default preferences in case they differ from saved ones */
ExampleWidgetProvider.poll=poll;
ExampleWidgetProvider.alert=alert;
ExampleWidgetProvider.backg=backg;
/* ... */
}
}
コードからアイデアを得ました。このコードは実際に動作し、環境設定が保存されないか正しく読み込まれないという問題ではなく、ユーザーの値に変更されたハードコードされた値が再び変更されていることに注意してください(上記の例を参照)。
/* change hardcoded values to user's settings */
ExampleWidgetProvider.poll=getpoll();
ExampleWidgetProvider.alert=getalert();
ExampleWidgetProvider.backg=getbackg();
/* store user settings we will continue to use these in the app */
SharedPreferences.Editor configEditor=config.edit();
configEditor.putInt(PREFS_UPDATE_RATE, ExampleWidgetProvider.poll);
configEditor.putInt(PREFS_ALERT, ExampleWidgetProvider.alert);
configEditor.putInt(PREFS_BACKG, ExampleWidgetProvider.backg);
configEditor.commit();
これらのハードコードされた値がいつデフォルトにリセットされるかを知る必要があります。私はそれを回避することができます毎回環境設定xmlを読んで、しかし、それは愚かなソリューションのように聞こえる。ドキュメントの状態として
ご希望の設定を表示できますか? – zode64
コードスニペットを追加しました。ところで、ExampleWidgetProvider。*変数は、ExampleWidgetProviderクラスのpublic static intとして宣言されています。 – aseq
実際にはこれは私が興味を持っていたこのビットです/ここで共有された設定やリフレッシュボタンの保留中のインテントなどを再読み込みするのに興味があった*/ – zode64