2017-06-01 81 views
-1

我正在製作一個鬧鐘應用程序。我使用setAlarmClock設置時間,WakefulBroadcastReceiver接受設置的鬧鐘。幾個小時後setAlarmClock失敗

當我使用測試它在1分鐘或30分鐘後響鈴時,即使我已經殺死了應用程序,鬧鐘響了起來。但每次我將它設置在5小時後響起,在WakefulBroadcastReceiver不再收到的PendingIntent

這裏是我的代碼在全局類:

public static void setAlarm (Context context, long timelong){ 
     SharedPreferences sharedPreferences = context.getSharedPreferences(KEY_PREFS, Context.MODE_PRIVATE); 
     SharedPreferences.Editor editor = sharedPreferences.edit(); 
     editor.putLong(KEY_SET_TIME, timelong); 
     editor.commit(); 

     myToaster(context, "Alarm will ring after " + timeCompare(timelong, System.currentTimeMillis())); 

     AlarmManager alarmManager = (AlarmManager) context.getSystemService(ALARM_SERVICE); 
     Intent intent = new Intent(context, AlarmReceiver.class); 
     PendingIntent pendingIntent = PendingIntent.getBroadcast(context, 0, intent, 0); 
     alarmManager.setAlarmClock(new AlarmManager.AlarmClockInfo(timelong, pendingIntent), pendingIntent); 
     } 

的WakefulBroadcastReceiver

public class AlarmReceiver extends WakefulBroadcastReceiver{ 

    final private String TAG = "AlarmReceiver"; 

    @Override 
    public void onReceive(Context context, Intent intent){ 
     Log.e(TAG, "received"); 
     Intent toRinger = new Intent(context, RingerActivity.class); 
     toRinger.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
     Log.e(TAG, "Received and firing intent"); 
     context.startActivity(toRinger); 
    } 
} 

然後,我設置RingerActivity.class onCreate上的mediaPlayer響鈴。

而且,這裏是我使用TimepickerFragment

public TimepickerFragment(){ 
    } 

    @Override 
    public Dialog onCreateDialog(Bundle savedInstanceState){ 
     //Use the current time as the default values for the time picker 
     textView = (TextView) getActivity().findViewById(R.id.textView); 
     Date d = new Date(); 
     int hour = d.getHours(); 
     int minute = d.getMinutes(); 

     //Create and return a new instance of TimePickerDialog 
     return new TimePickerDialog(getActivity(),this, hour, minute, 
       DateFormat.is24HourFormat(getActivity())); 
    } 

    //onTimeSet() callback method 
    public void onTimeSet(TimePicker view, int hour, int minute){ 
     Long timelong = timeToLong(hour, minute); 
     Globe.setAlarm(getContext(), timelong); 

     String timeString = Globe.dateToTimeString(new Date(timelong)); 
     String alarmInfo = getText(R.string.alarm_info) + " " + timeString; 
     textView.setText(alarmInfo); 
    } 

public static long timeToLong(int h, int m) { 
     Date d = new Date(); 
     d.setHours(h); 
     d.setMinutes(m); 
     if (d.getTime() <= System.currentTimeMillis()) 
      return (d.getTime() + (1000 * 60 * 60 * 24)); 
     else 
      return d.getTime(); 
    } 

因此,如何調用setAlarm方法,任何人都可以告訴我爲什麼,如果我把它進一步超過1個小時我的鬧鐘不工作,我怎麼修復它?

+0

我已經看到了關於這個主題的其他答案,但還是沒有找到我的答案。試圖爲SDK M使用setExactWhileIdle讓我的情況更糟糕。如果我在5分鐘後設置,但是在15分鐘後不會如此設置,則它會響鈴。 –

+0

5小時的傳遞時間如何顯示我們 – Tufan

+0

PendingIntent pendingIntent = PendingIntent.getBroadcast(this,0,intent,PendingIntent.FLAG_CANCEL_CURRENT); am.setRepeating(AlarmManager.RTC_WAKEUP,timelong pendingIntent); – Tufan

回答

0

在SO的另一個問題中發現它,並編輯了我的代碼。它完美的作品。但是,我試圖再次找到它,但無濟於事。所以,我把我的工作代碼放在這裏。

我編輯了我的WakefulBroadCastReceiver以啓動WakefulService。然後,我將自己的意願轉移到了WakefulService的Ringer Activity上。

public class AlarmReceiver extends WakefulBroadcastReceiver{ 

    final private String TAG = "AlarmReceiver"; 

    @Override 
    public void onReceive(Context context, Intent intent){ 
     Log.e(TAG, "received"); 
      Intent i = new Intent(context, AlarmReceiverService.class); 
      i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
      startWakefulService(context, i); 
     } 
    } 
} 

的wakefulService

public class AlarmReceiverService extends IntentService { 

    public AlarmReceiverService() { 
     super("AlarmReceiverService"); 
    } 

    @Override 
    protected void onHandleIntent(@Nullable Intent intent) { 
     Log.e("AlarmReceiverService", "Service received"); 
     Intent i = new Intent(this, RingerActivity.class); 
     i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK|Intent.FLAG_ACTIVITY_CLEAR_TASK); 
     startActivity(i); 
     AlarmReceiver.completeWakefulIntent(intent); 
    } 
} 
相關問題