2012-01-09 11 views
1

私は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を読んで、しかし、それは愚かなソリューションのように聞こえる。ドキュメントの状態として

+0

ご希望の設定を表示できますか? – zode64

+0

コードスニペットを追加しました。ところで、ExampleWidgetProvider。*変数は、ExampleWidgetProviderクラスのpublic static intとして宣言されています。 – aseq

+0

実際にはこれは私が興味を持っていたこのビットです/ここで共有された設定やリフレッシュボタンの保留中のインテントなどを再読み込みするのに興味があった*/ – zode64

答えて

1

パラメータ

好みの名前を検索するためのキー。 defValueこのプリファレンスが存在しない場合に返す値。

嗜好値(存在する場合)またはdefValueを返します。 例外:ClassCastException - この名前のプリファレンスがあり、 intではない場合。ドキュメントはその後、好みが全く存在しないと思われるのであれば、それはあなたが知っているあなたのgetInt値を返している場合

、あなたは、あなたのXMLで自分の価値観に異なるごgetInt値を作ることによってこれをテストすることができます設定が存在しません。

上記の場合、あなたの好みが削除されなければならないか、最初の場所に適切に設定されていなかった、とはいえ、これは非常に考えにくいです。

あなたがあなたの好みを更新したり、あなたの好みが更新されているときに、ISあなたがcommitを呼び出している見ることができるもう一つ。

また、ブロードキャスト受信者が別のプロセスであるため、MODE_MULTI_PROCESSを試してみてください。おそらく、あなたは設定を他の場所に設定していて、「MODE_WORLD_WRITEABLE」を試していると思われます。コメント

から

UPDATEはまず、コードは、私はそれをすべてを見ることはできませんが、私はそれと一緒に暮らす必要がありますので、あなたはここにプロジェクト全体をコピーすることはできませんので、私は推測する少し混乱しています。

これは私が問題を理解する方法です:あなたは、あなたの好みにこれらの値を設定していて、ある時点でこれらの好みにgetIntを呼び出すことができ、それは正しいです、そして(おそらくによってスタンドに行くことによってトリガー)、特定のイベントの後、あなたはgetIntをもう一度呼び出すと、preferenceはpreference.xmlに指定されているデフォルト値に戻され、getIntを呼び出すときに渡されるデフォルト値に戻りません(これは、環境設定が存在しないことを示唆します)。

これらのExampleWidgetProvider。*変数に値をコピーしていることにお気づきでしょう。これらの値が環境設定として取得している正しい値ではなく、環境設定に存在する値が正しく設定されていないことを確認してください。私は、あなたがどちらかを変更したときにそれらを同期させる必要があるので、これらの変数を持つ点を見逃す。彼らがその周りの仕事の一部である場合、彼らは元の問題を巻き返すことがないように取り除かなければなりません。

私はあなたが知っている確信していたよう。

アンドロイド:はdefaultValueデフォルトアプリを再起動した場合の好みは(あなたがそれらを正しく設定している仮定)、それが文書で述べているようプリファレンス値が永続化されると、再起動前と同じにする必要があります永続がオフであるか、または永続がオンで 好ましいのは、永続ストレージに見つからない場合 のいずれかに設定する優先、の値。

これは、設定が元の値にリセットされず、何らかの理由で存在しないことを示唆しています(このデフォルト値が再表示され続ける場合)。

setDefaultValues(Context context, int resId, boolean readAgain=true)というメソッドがありますが、あなたはそれを呼び出さないと言いました。したがって、優先度がリセットされている可能性は低いと思われますが、最初に優先度が削除されたことはありません。

+0

問題は、設定が保存されていないことではなく、正しく保存されていることです。問題は、ユーザーが設定した(保存されている)設定がリセットされることがある点です。ハードコーディングされた設定は、ユーザが設定したものに変更され、その変数がアプリケーションで使用されることに注意してください。元のハードコードされた値が10で、ユーザーが20に変更した(20として保存されている)と、元のハードコードされた値が10にリセットされます。 – aseq

+0

あなたは部分的に正しいですが、私はgetIntを呼び出したり、スタンバイから出たりしてから再度呼び出すことはありません。その場合、環境設定はXMLから読み込まれ、正しいものになります(このイベントを検出する方法を見つけようとしています)。デフォルト設定はハードコードされた変数であり、決してXMLに保存されません。これらの変数は、ユーザーがアプリを設定して保存すると変更されます。問題は、これらの変数がある時点でハードコードされた値に戻されることです。私は混乱している説明をお詫び申し上げます。 :-) – aseq

+0

私は、あなたの好みを保存しているシステムによって生成されたファイルを意味します。 – zode64

関連する問題