2011-09-02 36 views
6

アラームタスクを実行し、ウィジェットを更新し、必要に応じて通知を送信するために、AlarmManagerを実装して電話を1日に1回スリープ状態にしました。Android AlarmManager setRepeatingは長い間隔で繰り返されません

私はアラームが初めて(SystemClock.elapsedRealtime()+60000) をトリガされますが、それは86400000ミリ秒(24時間)後にトリガーされませんsetRepeatingELAPSED_REALTIME_WAKEUP を使用しています。

本当にこれに苦しんでいます。私は何か間違っていることを受け入れるか、私がやろうとしていることを達成するためのよりよい方法があればうれしく思います。しかし、私のコードは、人々がやるような標準的なもののように見えると思います。

これは、繰り返しアラームがすべての場合にそうすべきことをしないのとほぼ同じです。私が10分と言うように間隔を狭めると、アラームが作動し、サービスが繰り返し実行されます。

私のアプリの性質は、1日に1回以上の更新が過度であることを意味します。 私はこれに対して現実的で信頼できる解決法を見つける必要があります。

ありがとうございます&私は正しい方向に私を指すことができますように願っています。

ここに私のアラーム実装コードは...だ

マニフェスト:ブート放送用

<receiver android:name=".SystemChangeReceiver"> 
    <intent-filter> 
     <action android:name="android.intent.action.BOOT_COMPLETED" /> 
     <action android:name="android.intent.action.ACTION_EXTERNAL_APPLICATIONS_AVAILABLE" /> 
    </intent-filter> 
</receiver> 
<receiver android:name=".UpdateAlarmReceiver" /> 
<service android:name=".UpdateService" /> 
<receiver android:name=".WidgetProviderSmall" android:label="@string/widget_small_label"> 
    <intent-filter> 
     <action android:name="android.appwidget.action.APPWIDGET_UPDATE" /> 
    </intent-filter> 
    <meta-data 
     android:name="android.appwidget.provider" 
     android:resource="@xml/appwidget_small" /> 
</receiver> 
<receiver android:name=".WidgetProviderLarge" android:label="@string/widget_large_label"> 
    <intent-filter> 
     <action android:name="android.appwidget.action.APPWIDGET_UPDATE" /> 
    </intent-filter> 
    <meta-data 
     android:name="android.appwidget.provider" 
     android:resource="@xml/appwidget_large" /> 
</receiver> 

SystemChangeReceiver聴取し、チェックし、それは、それはそれを設定した場合、アラームは、設定する必要がある場合。

SystemChangeReceiver

@Override 
public void onReceive(Context context, Intent intent) { 

    SharedPreferences prefs = context.getSharedPreferences(context.getString(R.string.prefs_name), 0); 

    Boolean notifications = prefs.getBoolean("enable_updates", false); 
    if(notifications == true) { 
     Utils.setNotificationAlarm(context); 
    } 
} 

setNotificationAlarm方法、アラームが私の受信機UpdateAlarmReceiverは何をすべきかを決定するトリガーとWakefulIntentService実行に私のバックグラウンド更新を使用している場合...

public static void setNotificationAlarm(Context context) { 
     AlarmManager alarmManager=(AlarmManager)context.getSystemService(Context.ALARM_SERVICE); 

     Intent intent = new Intent(context, UpdateAlarmReceiver.class); 
     PendingIntent pi = PendingIntent.getBroadcast(context, 0, intent, 0); 

     alarmManager.setRepeating(
      AlarmManager.ELAPSED_REALTIME_WAKEUP, 
      SystemClock.elapsedRealtime()+60000, 
      86400000, 
      pi); 
} 

を繰り返しアラームを設定しますサービスのハンドラは、ウィジェットを更新し、必要に応じて通知を送信します。

UpdateAlarmReceiver

public void onReceive(Context context, Intent intent) { 
    WakefulIntentService.sendWakefulWork(context, UpdateService.class); 
} 
+0

これをすべて解決する簡単な質問:タスクキラーを使用していますか?あなたのアプリはホワイトリストに載っていますか? –

+0

私は実際にAutoKiller Memory Optimizerを使用していますが、これはホワイトリストを持っていません。プロセスリストによれば、私のアプリはまだ動作しています。 – Rob

答えて

1

これを繰り返さないように設定してみましたか?それから火を消すと、24時間後に次の単発アラームがセットされます。これは繰り返しアラームのように機能しますが、あなたが見ている問題のいくつかを回避する可能性があります。

+0

私はこれを考慮していません。私はそれが基本的にsetRepeatingがしたものだと思った。私はそれを試してみましょう、ありがとう。 – Rob

+0

私は目覚まし時計のタイプのアプリケーションを作った、これは私がそれをどのように処理したのか、正しく私のためにAlarmActivityが正しい時刻に翌日に起動するように促すように思えた。私は決してsetRepeating()フラグを使用したことはありませんが、なぜそれが動作しないのか分からないので、これらの2つのアプローチが同じように機能するように思えます。デバイスが起動したときにデバイスを正しく起動していない可能性がありますか? – FoamyGuy

+0

「PowerManager.WakeLock」を使用している 'WakefulIntentService'を使ってうまく起きていると思います。 – Rob

2

明らかに間違っていることはありません。 このような長い期間のために、私は夜中に、またはおそらくユーザが選択できる時間に、半時間から24時間ではなく、それを発生させるように調整することができます-random開始点。可能であればRTC_WAKEUPより良い結果が得られます。また

は:

  • はあなたがすべてでコントロールを得ているかどうかを確認するためにUpdateAlarmReceiveronReceive()へのロギングステートメントを追加するか、または問題があるかどうか(息をのむ!)WakefulIntentServiceと。
  • 着実に期間を伸ばしてください。 10分、1時間、4時間などを試してみましょう。
  • "私は実際にAutoKiller Memory Optimizerを使用していますが、これは問題になる可能性のあるホワイトリストを持っていませんか?私のアプリはプロセスリストによれば実行中です。" - 私はすべてのタスクキラーを無効にして、干渉していないことを確認します。
+0

ありがとうございました。私はすでに様々な場所でロギングを追加しています。どこかで障害のあるアラームマネージャ。私は今、メモリオプティマイザを無効にして、他のすべての提案を試してみてください。 – Rob

+0

@Rob:私が知っているのは、予定されているアラームを取り除く唯一の事は、あなたが 'cancel()'した場合、ユーザーが強制的に設定アプリケーションのサービスの管理から停止した場合、 (それは2.1以前の問題でしかないかもしれません - 私は 'killBackgroundProcesses()'がアラームを消去するとは思っていませんでしたが、間違っているかもしれません)。うまくいけば、AutoKillerが原因だと分かるでしょう。 – CommonsWare

関連する問題