重复报警不准确

mar*_*kos 4 java eclipse android alarmmanager

我做了一个应用程序,它有一个数字选择器,范围从1到60分钟,我连接到一个重复的报警管理器.当我试一试时,我注意到它有时候不准确,要么需要更多的工作时间,要么更少.

可能是什么问题呢?

对于开始按钮:

startB.setOnClickListener(new OnClickListener()
     {

        @Override
        public void onClick(View v) {
            // TODO Auto-generated method stub
            if (startB.isChecked())
            {
            Calendar calSet = Calendar.getInstance();
            calSet.set(Calendar.MINUTE, picker2.getValue());
            calSet.set(Calendar.SECOND, 0);
            calSet.set(Calendar.MILLISECOND, 0);
            setAlarm(calSet);

            SharedPreferences.Editor editor = getPreferences(MODE_PRIVATE).edit();
            editor.putBoolean("toggleButton", startB.isChecked());
            editor.commit();
                timerHasStarted = true;

            }
        else
            {
            Intent intent = new Intent(getBaseContext(), MainReceiver.class);
            PendingIntent pendingIntent = PendingIntent.getBroadcast(getBaseContext(), RQS_1, intent, 0);
            AlarmManager alarmManager = (AlarmManager)getSystemService(Context.ALARM_SERVICE);
            alarmManager.cancel(pendingIntent);

            SharedPreferences.Editor editor = getPreferences(MODE_PRIVATE).edit();
            editor.putBoolean("toggleButton", startB.isChecked());
            editor.commit();
                timerHasStarted = false;

            }
        }  
        });
Run Code Online (Sandbox Code Playgroud)

对于警报:

private void setAlarm(Calendar targetCal ) {
    // TODO Auto-generated method stub
    Intent intent = new Intent(getBaseContext(), MainReceiver.class);
    PendingIntent pendingIntent = PendingIntent.getBroadcast(getBaseContext(), RQS_1, intent, 0);
    AlarmManager alarmManager = (AlarmManager)getSystemService(Context.ALARM_SERVICE);
    alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, 
            targetCal.getTimeInMillis(), 
            TimeUnit.MINUTES.toMillis(picker2.getValue()),
            pendingIntent);
}
Run Code Online (Sandbox Code Playgroud)

接收器:

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

         MediaPlayer m=MediaPlayer.create(context, R.raw.sound);
         m.start();

    }
Run Code Online (Sandbox Code Playgroud)

Don*_*oom 6

Android操作系统能够移动警报,以最大限度地减少唤醒和电池消耗(自API 19起).看看这里.我注意到延迟几秒钟.

一般来说,一个非常好的警报教程可以在这里找到