2016-03-30 5 views
0

私は、サービスとして実行するServiceから次のコードをバックグラウンドで取得しています。このクラスでは、SharedPreferences.OnSharedPreferenceChangeListenerクラスを使用して、共有の設定が変更されているかどうかを確認して、BroadcastReceiverを一定の時間間隔(6時間ごとなど)で再起動するように再初期化します。しかし、主なアクティビティの明示的な共有設定を3時間に変更すると、コードを3時間(6時間ではなく)で実行する必要があります。ここでServiceのコードされています"実際の引数<匿名のOnSharedPreferenceChangeListener>をメソッド呼び出し変換によってコンテキストに変換できません"

public class AlarmService extends Service 
{ 
    public Alarm alarm = new Alarm(); 
    public SharedPreferences sharedPref = PreferenceManager.getDefaultSharedPreferences(this); 

    public void onCreate() 
    { 
     super.onCreate(); 
     SharedPreferences.OnSharedPreferenceChangeListener spChanged = new 
      SharedPreferences.OnSharedPreferenceChangeListener() { 
       @Override 
       public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, 
                 String key) {      
        // reinitialize the alarm 
        alarm.SetAlarm(this); // ERROR HERE 
       } 
     }; 
     //SharedPreferences sharedPref = PreferenceManager.getDefaultSharedPreferences(this); 
     sharedPref.registerOnSharedPreferenceChangeListener(spChanged); 
    } 

    @Override 
    public int onStartCommand(Intent intent, int flags, int startId) 
    { 
     Log.d("!~!", "Service started."); 
     alarm.SetAlarm(this); 
     return START_STICKY; 
    } 


    @Override 
    public IBinder onBind(Intent intent) 
    { 
     return null; 
    } 
} 

方法SetAlarmBroadcastReceiverから派生したクラスで定義されており、次のように実装されています

public void SetAlarm(Context context) 
    { 
     // get the update cylce from the prefences 
     SharedPreferences sharedPref = PreferenceManager.getDefaultSharedPreferences(context); 
     int updateInterval = Integer.parseInt(sharedPref.getString("updateInterval", "24")); 
     Log.d(LOGHEAD, String.format("Alarm set to update every %d hours.", updateInterval)); 


     AlarmManager am = (AlarmManager)context.getSystemService(Context.ALARM_SERVICE); 
     Intent intent = new Intent(context, Alarm.class); 
     PendingIntent pi = PendingIntent.getBroadcast(context, 0, intent, 0); 
     am.setRepeating(AlarmManager.RTC_WAKEUP, System.currentTimeMillis(), 1000 * 60 * updateInterval, pi); // Millisec * Second * Minute 
    } 

しかし、私はコードをコンパイルするとき、私は次の取得しますエラー:

Error:(33, 26) error: method SetAlarm in class Alarm cannot be applied to given types; 
required: Context 
found: <anonymous OnSharedPreferenceChangeListener> 
reason: actual argument <anonymous OnSharedPreferenceChangeListener> cannot be converted to Context by method invocation conversion 

エラーが発生した場所は上記のとおりです。もう一度、私は「文脈」に関連したエラー、コンセプトを取得し、私はまだ理解して失敗しています...

私は特に、コードの下にそのfutherコール

alarm.SetAlarm(this); 
、事実によって当惑しています

は問題なく動作しています。おそらく問題は内部クラスの使用によるものでしょうか?

これを修正する方法はありますか?または、コード全体を修正しますか?私は例からのコードをまとめました。これが良いアンドロイドコードであるかどうかはわかりません。

答えて

0

この特定の文脈では、thisはエラーメッセージに示すようにOnSharedPreferenceChangeListenerを参照しています。

外部サービスインスタンスを参照するには、をAlarmService.thisと置き換えてください。

コメントに基づいて、onCreate()内の設定を初期化する必要があります。

だけ好み

private SharedPreferences sharedPref; 

を宣言してからonCreate()内でリスナーthis内部

sharedPref = PreferenceManager.getDefaultSharedPreferences(this); 
+0

他の問題にも対処するための回答が更新されました。 –

+0

実際には、グローバルなsharedPrefは必要ありませんが、あなたは正しいアイデアを持っていると確信しています... – Alex

+0

私は参照してください。また、あなたが遭遇する可能性があることに気づくべきことは、[here](http:// stackoverflow。'OnSharedPreferenceChangeListener'を強く参照せずに登録することについての情報を提供しています(com/a/3104265/1435985)。 –

0

を行う最初にContextクラスを拡張しないOnSharedPreferenceChangeListenerオブジェクトを参照しています。有効なContextオブジェクトをsetAlarmメソッドに渡す必要があります。
しかし、onStartCommandでsetAlarmを呼び出すと、thisはAlarmServiceオブジェクトを表します。

詳細については、Oracle documentationを参照してください。

関連する問題