2014-12-20 113 views
1

*我正在開發一個Android應用程序,在用戶選擇的特定時間觸發鬧鐘。但問題是,如果用戶從現在起將其設置爲一小段時間,則只會觸發該警報。所以就好像應用程序沒有運行,警報不會觸發。我已經獲得一個鎖,並設置標誌以保持屏幕。有時當我將它設置爲從現在開始15分鐘或類似的工作,然後我再試一次,但它不。我還將廣播接收器包含在清單中。這裏是我的日程表報警代碼:鬧鐘並不總是觸發android

public void schedule(Activity activity){ 
    Context context = activity.getApplicationContext(); 
    AlarmManager alarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE); 
    Intent intent = new Intent(context, AlarmActivityBroadcastReceiver.class); 
    intent.putExtra("id", this.getId()); 
    pendingIntent = PendingIntent.getBroadcast(context, 1234565666, intent, PendingIntent.FLAG_UPDATE_CURRENT); 
    alarmManager.setExact(AlarmManager.RTC_WAKEUP, this.getCalendarTime().getTimeInMillis(), pendingIntent); 
} 

得到我使用下面的函數,時間是用戶輸入的時間字符串calendarTime:

private Calendar convertTimeStringToCalendar(){ 
    String[] timeArray = this.time.split(":"); 
    int minute = Integer.parseInt(timeArray[1]); 
    int hour = Integer.parseInt(timeArray[0]); 

    Calendar c = Calendar.getInstance(); 
    c.setTimeInMillis(System.currentTimeMillis()); 

    int nowHour = c.get(Calendar.HOUR_OF_DAY); 
    int nowMinute = c.get(Calendar.MINUTE); 
    if (hour < nowHour || (hour == nowHour && minute <= nowMinute)) { 
     c.add(Calendar.DAY_OF_YEAR, 1); 
    } 
    c.set(Calendar.HOUR_OF_DAY, hour); 
    c.set(Calendar.MINUTE, minute); 
    c.set(Calendar.SECOND, 0); 
    c.set(Calendar.MILLISECOND, 0); 
    return c; 
} 

最後,這是我的廣播接收器:

public class AlarmActivityBroadcastReceiver extends BroadcastReceiver { 

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

    WakeLock.acquire(context); 

    Alarm alarm = DataBaseSQL.getAlarm(intent.getLongExtra("id", 0L)); 
    Intent alarmActivityIntent = new Intent(context, AlarmActivity.class); 
    alarmActivityIntent.putExtra("id", alarm.getId()); 
    alarmActivityIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
    alarmActivityIntent.addFlags(Intent.FLAG_ACTIVITY_NO_USER_ACTION); 
    context.startActivity(alarmActivityIntent); 
} 
} 

我希望得到任何幫助,它可能只是有時只觸發警報的原因。

+0

'和獲取數據的方法還設置了標誌,以保持屏幕on'左右,**殺用戶的電池**? –

+0

不,這是一個鬧鐘,所以我需要屏幕直到用戶解散它! – Martina

回答

0

此代碼工作正常,我可以使用它,我希望它會爲你工作。

這是在主activty

public void fetchdata() {  
      Calendar calendar = Calendar.getInstance(); 
       calendar.set(Calendar.MONTH, month); 
       calendar.set(Calendar.YEAR, year); 
       calendar.set(Calendar.DAY_OF_MONTH, day); 
       calendar.set(Calendar.HOUR_OF_DAY, hour); 
       calendar.set(Calendar.MINUTE, minute); 
       Intent myIntent = new Intent(MainActivity.this, MyBroadcastReceiver.class); 
       pendingIntent = PendingIntent.getBroadcast(MainActivity.this, 0, myIntent,0); 
       AlarmManager alarmManager = (AlarmManager)getSystemService(ALARM_SERVICE); 
       alarmManager.set(AlarmManager.RTC, calendar.getTimeInMillis(), pendingIntent); 
     } 


This is broadcast receiver class 



public class MyBroadcastReceiver extends BroadcastReceiver { 
     int notifyID=1; 
     public void onReceive(Context context, Intent intent) { 

      Intent i=new Intent(); 
      PendingIntent pi=PendingIntent.getBroadcast(context,0,i,0); 
      NotificationManager nm=(NotificationManager)context.getSystemService(Context.NOTIFICATION_SERVICE); 
      Notification notify=new Notification(R.drawable.ic_launcher,"Notification Triggered",System.currentTimeMillis()); 
      CharSequence from="Remainder"; 
      CharSequence message="Hurry up!!!!"; 
      notify.setLatestEventInfo(context, from, message, pi); 
      nm.notify(notifyID,notify); 

      // Vibrate the mobile phone 
      Vibrator vibrator = (Vibrator) context 
        .getSystemService(Context.VIBRATOR_SERVICE); 
      vibrator.vibrate(2000); 
     } 

    } 
+0

在我的項目中,警報通知在設置警報後顯示。 –

+0

感謝您的回答!我設法讓它使用getService而不是getBroadcast,因此使用服務來代替。 – Martina

+0

okk很棒@Martina –