2016-01-06 107 views
2

我为android创建一个闹钟应用程序,出于某种原因,总有一些东西在我的报警中延迟20-60秒。我不知道为什么它使用setExact()方法的API发生作为即时通讯19+报警应用程序不准确

我的代码:

private void setAlarm() { 
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { 
     mHour = mTimePicker.getHour(); 
     mMinutes = mTimePicker.getMinute(); 
    } else { 
     mHour = mTimePicker.getCurrentHour(); 
     mMinutes = mTimePicker.getCurrentMinute(); 
    } 

    Calendar calendar = Calendar.getInstance(); 
    calendar.set(Calendar.HOUR_OF_DAY, mHour); 
    calendar.set(Calendar.MINUTE, mMinutes); 

    AlarmManager alarmManager = (AlarmManager) getSystemService(ALARM_SERVICE); 
    Intent alarmIntent = new Intent(EditAlarm.this, AlarmReceiver.class); 
    PendingIntent pendingIntent = PendingIntent.getBroadcast(EditAlarm.this, 0, alarmIntent, 0); 


    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) { 
     alarmManager.setExact(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), pendingIntent); 
    } else { 
     alarmManager.set(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), pendingIntent); 
    } 

} 

报警接收机

public class AlarmReceiver extends WakefulBroadcastReceiver { 

public AlarmReceiver() { 
} 

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

    Toast.makeText(context, "Alarm works", Toast.LENGTH_LONG).show(); 
    Intent alarmIntent = new Intent(context, AlarmActivity.class); 
    alarmIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
    context.startActivity(alarmIntent); 
} 

报警活动

public class AlarmActivity extends AppCompatActivity { 
private Vibrator mVibrator; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_alarm); 
    final Window win = getWindow(); 
    win.addFlags(WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED | 
      WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD); 
    win.addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON | 
      WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON); 


    // The ringing effects 
    Uri alarmUri = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_ALARM); 
    if (alarmUri == null) { 
     alarmUri = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION); 
    } 
    Ringtone ringtone = RingtoneManager.getRingtone(this, alarmUri); 
    ringtone.play(); 
    mVibrator = (Vibrator) this.getSystemService(Context.VIBRATOR_SERVICE); 
    long[] pattern = { 0, 300, 200, 300, 100, 100 }; 
    mVibrator.vibrate(pattern, 0); 

    // UI 
    Button stopButton = (Button) findViewById(R.id.finishButton); 
    stopButton.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
        mVibrator.cancel(); 
        finish(); 
     } 
    }); 
} 

我在做什么错?提前致谢;)

+0

首先,请注意你的'Calendar'代码有缺陷,因为你不处理其中'mHour'是之前,现在的情况下(例如,它刚刚在我所在的地方变成了中午,因此,从0到11的'mHour'是过去的)。除此之外,您正在测试的确切硬件是什么,以及如何测试它?请记住,许多设备(包括所有运行的Android 6.0+)都具有可以忽略或延迟某些AlarmManager定时事件以节省电池的功能。 – CommonsWare

回答

3

为了解决这个问题,你需要设置秒。您需要将其设置为零的焙烧,在指定分钟到达:

Calendar calendar = Calendar.getInstance(); 
calendar.set(Calendar.HOUR_OF_DAY, mHour); 
calendar.set(Calendar.MINUTE, mMinutes); 
calendar.set(Calendar.SECOND, 0); 
+0

谢谢,我完全忘记了几秒钟! – Yogurt33

+0

@酸奶33:不客气。快乐编码! –