16

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

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);
    }
}

还有我的 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");
    }
}

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

4

2 回答 2

22

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

如果您的目标是在您拨打电话后 10000 毫秒内发生这种情况set(),那么该set()电话应该是:

alarmManager.set(alarmType, SystemClock.elapsedRealtime()+timeOrLengthofWait, alarmIntent);
于 2013-07-19T21:15:40.380 回答
14

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

解决方案:

cal.add(Calendar.DATE, 1);

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

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

于 2014-07-04T12:42:55.627 回答