2011-12-09 10 views
2

私はAndroid用のライブ壁紙を開発しています。設定した時間に壁紙を更新するには、AlarmManagerを使用します。ほとんどの場合、これはうまくいくが、時折私の警報は受信されない。その上に私はこの振る舞いを再現することはできません。ただランダムに起こります。私は少なくとも3つのROMを使ってこれに挑戦しました。AlarmManagerが時折アラームを発しません。

コードのためです。

mAlarmManager.set(AlarmManager.RTC_WAKEUP, time, mPendingRefreshIntent); 

時間はミリ秒単位のUTC時刻である:これは私のコードは、アラームを設定することです

mRefreshIntent = new Intent() 
    .setComponent(new ComponentName(mContext, RefreshBroadcastReceiver.class)) 
    .setAction("my.package.name.REFRESH_WALLPAPER"); 
mPendingRefreshIntent = PendingIntent.getBroadcast(
    mContext, 
    0, 
    mRefreshIntent, 
    PendingIntent.FLAG_CANCEL_CURRENT); 


私はこのPendingIntentを使用しています。アラームが意図通りに設定されているかどうかは、しばしばadb shell dumpsys alarmを使って確認しました。

受信側:

public class RefreshBroadcastReceiver extends BroadcastReceiver { 
    @Override 
    public void onReceive(Context context, Intent intent) { 
     Log.d("DayNight", "onReceive  ; " + System.currentTimeMillis()); 
     DayNightService.refresher.refresh(); 
     Log.d("DayNight", "onReceive done; " + System.currentTimeMillis()); 
    } 
} 

関連マニフェスト行:

<application> 
    ... 
    <receiver 
     android:name="RefreshBroadcastReceiver"> 
     <intent-filter> 
      <action android:name="my.package.name.REFRESH_WALLPAPER" /> 
     </intent-filter> 
    </receiver> 
    ... 
</application> 

解雇されていないアラームは、常に事前に(dumpsysアラーム)キューに存在し、その後アラームログではありません。彼らはゼロからゼロを失ったように見えます。

あなたのうちの1人が私のためにこの問題を解決できるなら、私は非常にうれしく思います。

+0

ブロードキャスト受信機クラスを使用しているかどうか –

+0

はい、3番目のコードブロックを参照してください。 – Thomas

+0

私は、既存のアラームをキャンセルして新しい時刻に再作成すると、同じことが起こっています。 adb上に正しい時間が残っていることを示しますが、0になると何も起こりません。 – draksia

答えて

2

私は次のコードを使用し

Intent intent = new Intent(ACTION); 
    PendingIntent pendingIntent = PendingIntent.getBroadcast(context, 0, intent, PendingIntent.FLAG_NO_CREATE); 
    Log.d(LOG_TAG, "pending intent: " + pendingIntent); 
    // if no intent there, schedule it ASAP 
    if (pendingIntent == null) { 
     pendingIntent = PendingIntent.getBroadcast(context, 0, intent, 0); 
     // schedule new alarm in 15 minutes 
     alarmService.setInexactRepeating(AlarmManager.RTC, System.currentTimeMillis(),300000, pendingIntent); 
     Log.d(LOG_TAG, "scheduled intent: " + pendingIntent); 
    } 

注、私は不正確繰り返しアラームとRTC(ないRTC_WAKEUP)を要求することは - 携帯電話はジーンズのポケットの内側に深く眠っている場合、ユーザーは自分のライブ壁紙の変更に興味がありません - バッテリージュースやウェイクアップ電話を無駄にする必要はありません

ブートスケジューリング を再起動するには、起動完全なブロードキャストレシーバーを登録する必要があります。

+0

これは実際に私が探しているものではありません。リフレッシュの間隔が毎回異なり、バッテリーの寿命が心配されていません(私がいた場合、RTC_WAKEUPをRTCに置き換えることができます)。おそらく、私のコードやAlarmManagerのバグにどこにエラーがあるのか​​を指摘できますか? – Thomas

+0

このインテントはどこで有効になっていますか? –

+0

'WallpaperService.WallpeperEngine.onCreate()'の最初のものです。次のアラームは、前のアラームがトリガされたときなどに設定されます。 – Thomas

関連する問題