警报管理器立即触发

Rid*_*hid 14 android alarmmanager

嗨,我目前正在使用AlarmManager.我写了下面给出的代码.根据代码,应在10秒后触发AlarmManager,但在我的代码中,警报管理器会立即触发.请帮忙.

public class MainActivity extends Activity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        AlarmManager alarmManager = (AlarmManager)getSystemService(Context.ALARM_SERVICE);
        int alarmType = AlarmManager.ELAPSED_REALTIME_WAKEUP;
        long timeOrLengthofWait = 10000;
        Intent intentToFire = new Intent(this, AlarmReciever.class);
        PendingIntent alarmIntent = PendingIntent.getBroadcast(this, 0, intentToFire, 0);
        alarmManager.set(alarmType, timeOrLengthofWait, alarmIntent);
    }
}
Run Code Online (Sandbox Code Playgroud)

和我的AlarmReciever类

public class AlarmReciever extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {

        String phoneNumberReciever="5556";
        String message="Alarm Triggered";
        SmsManager sms = SmsManager.getDefault(); 
        sms.sendTextMessage(phoneNumberReciever, null, message, null, null);
        Toast.makeText(context," A message has been sent", Toast.LENGTH_LONG).show();

        Log.d("Alarm ", "Alarm Has been triggered and sms send");
    }
}
Run Code Online (Sandbox Code Playgroud)

我已经在清单中添加了所需的权限.

Com*_*are 16

您正在使用警报类型ELAPSED_REALTIME_WAKEUP.这意味着第二个参数set()必须是从现在开始的毫秒数,现在表示为SystemClock.elapsedRealtime().

如果您的目标是在您set()拨打电话后发生10000毫秒,则该set()呼叫应为:

alarmManager.set(alarmType, SystemClock.elapsedRealtime()+timeOrLengthofWait, alarmIntent);
Run Code Online (Sandbox Code Playgroud)

  • 作为一个愿望,该文件说:"如果你指定的触发时间是过去的,警报会立即触发." 您在问题中提供的10000的时间戳肯定代表过去的日期.这就是您的警报立即触发的原因.有关详细信息,请访问https://developer.android.com/training/scheduling/alarms.html#set (2认同)

Shr*_*hat 14

如果您要为过去的时间创建警报的PendingIntent,它将立即被触发.示例 - 为今天上午8点安排警报,但在上午11点左右执行代码将立即触发.

解:

cal.add(Calendar.DATE, 1);

long delay = 24 * 60 * 60 * 1000;
alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, cal.getTimeInMillis(), delay,pendingIntent);` 
Run Code Online (Sandbox Code Playgroud)

这将在第二天的特定时间(即早上8点)发射事件;

  • "如果您在过去一段时间内创建警报的PendingIntent,它将立即被触发".帮助了我很多. (5认同)