2016-07-16 84 views
0

我正在使用應用程序中的鬧鐘管理器,並且需要一些DefaultSharedPreferences值在上午2:00重置(設置爲0)。 我有我的主要活動的功能被稱爲每當應用程序是開放的:Android AlarmManager無法正常工作

protected void setUpAlarmManager(){ //To delete the data of each day and pass it to Records database 
     AlarmManager alarmManager = (AlarmManager) this.getSystemService(Context.ALARM_SERVICE); 
     Intent intent = new Intent(this, AlarmReceiver.class); 
     PendingIntent pIntent = PendingIntent.getBroadcast(this, 1, intent, PendingIntent.FLAG_CANCEL_CURRENT); 
     Calendar calendar = Calendar.getInstance(); 
     calendar.set(Calendar.HOUR_OF_DAY, 02); 
     calendar.set(Calendar.MINUTE, 00); 
     calendar.set(Calendar.SECOND, 00); 
     alarmManager.setInexactRepeating(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), AlarmManager.INTERVAL_DAY , pIntent); //set repeating every 24 hours 
     Log.i("Set", "Alarm set"); 
    } 

然後我用一個BroadcastReceiver重置值。

package com.javierd.iifym; 

import android.content.Context; 
import android.content.Intent; 
import android.content.SharedPreferences; 
import android.database.Cursor; 
import android.util.Log; 

import com.javierd.iifym.sqlite.RecordsDataSource; 

//To delete the data of each day and pass it to Records database 
public class AlarmReceiver extends android.content.BroadcastReceiver { 

    private RecordsDataSource dataSource; 
    private Utils utils; 

    @Override 
    public void onReceive(Context context, Intent intent) { 
     Log.i("Time", "TIMEEEE!!!!"); 
     SharedPreferences macros = context.getSharedPreferences(context.getPackageName() + "_preferences", Context.MODE_PRIVATE); //As we store data using DefaultSharedPreferences, not SharedPreferences 
     SharedPreferences.Editor editor = macros.edit(); 
     editor.putString("eaten_carbs", "0"); 
     editor.putString("eaten_proteins", "0"); 
     editor.putString("eaten_fats", "0"); 
     editor.apply(); 
    } 
} 

接收機工作,問題是AlarmManager隨機工作。雖然它應該只在凌晨2點,也許你在16:00進入應用程序,保存一些值,下次你在17:30輸入值被刪除,或者可能不會,這是隨機的東西我不明白這一點。

+0

如果手機被關閉這將無法正常工作 - 報警消失在重新啓動。 – natario

回答

1

這樣的效果是由我使用AlarmManager.setInexectRepeating(int, long, long, PendingIntent)造成的。 按照documentation

你的報警器的第一個觸發器將不是要求的時間之前,但 它可能不適合在此時間之後幾乎整整間隔發生。

當您使用此方法時,Android會同步多個不精確的重複警報並同時觸發它們。考慮到時間間隔是一天,鬧鐘可能會在17:30開槍。

如果報警需要在凌晨2點完全啓動,那麼我建議使用AlarmManager.setRepeating(int, long, long, PendingIntent)方法。

請注意,建議儘可能避免使用精確警報,以減少電池電量消耗。

已更新。

我會建議檢查觸發時間是否不在過去。

能不能請你

protected void setUpAlarmManager(){ //To delete the data of each day and pass it to Records database 
     AlarmManager alarmManager = (AlarmManager) this.getSystemService(Context.ALARM_SERVICE); 
     Intent intent = new Intent(this, AlarmReceiver.class); 
     PendingIntent pIntent = PendingIntent.getBroadcast(this, 1, intent, PendingIntent.FLAG_CANCEL_CURRENT); 
     Calendar calendar = Calendar.getInstance(); 
     calendar.set(Calendar.HOUR_OF_DAY, 2); 
     calendar.set(Calendar.MINUTE, 0); 
     calendar.set(Calendar.SECOND, 0); 
     if (Calendar.getInstance().after(calendar)) { 
      calendar.add(Calendar.DAY_OF_MONTH, 1); 
     } 
     alarmManager.setInexactRepeating(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), AlarmManager.INTERVAL_DAY , pIntent); //set repeating every 24 hours 
     Log.i("Set", "Alarm set"); 
    } 
+0

是的,我知道,這就是爲什麼我要使用setInexactRepeating。 我已將其更改爲setRepeating,但仍然失敗。 是否可以產生錯誤,因爲每次打開應用程序時都會設置alarmManager? – Javierd98

+0

@ Javierd98如果每次打開應用程序時都設置鬧鐘,那麼是的,這可能是原因。 'calendar.set(Calendar.HOUR_OF_DAY,02)'這行''不保證將來的結果日期。例如,如果當前時間是17:30,結果時間將是02:00,*當天*,這是過去的時間。所以在設置這樣的警報之後,系統會盡可能地儘快啓動它。 – Dmitriy

+0

嗯,好吧,那麼我應該如何設置alarmManager呢? – Javierd98