Java Android设置报警时钟立即触发

Java Android设置报警时钟立即触发,java,android,alarmmanager,android-alarms,Java,Android,Alarmmanager,Android Alarms,我创建了一个简单的应用程序来试用setAlarmClock()。main活动中只有一个按钮,单击时会调用setAlarm 代码如下 main活动 public class MainActivity extends AppCompatActivity { private static final String TAG = "alarmclock.MainActivity"; @Override protected void onCreate(Bundl

我创建了一个简单的应用程序来试用
setAlarmClock()
main活动中只有一个按钮
,单击时会调用
setAlarm

代码如下

main活动

public class MainActivity extends AppCompatActivity {
    private static final String TAG = "alarmclock.MainActivity";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }

    public void setAlarm(View view) {
        Context context = getApplicationContext();
        Intent intent = new Intent(context, AlarmReceiver.class);
        PendingIntent pendingIntent = PendingIntent.getBroadcast(context, 0, intent, 0);

        long nextTrigger = SystemClock.elapsedRealtime()+10*1000;
        Log.i(TAG, SystemClock.elapsedRealtime() + ": scheduling next alarm at " + nextTrigger);

        AlarmManager alarmManager = (AlarmManager) getSystemService(ALARM_SERVICE);

        AlarmManager.AlarmClockInfo ac = new AlarmManager.AlarmClockInfo(nextTrigger, null);
        alarmManager.setAlarmClock(ac, pendingIntent);
    }
}
AlarmReceiver

public class AlarmReceiver extends BroadcastReceiver {
    private static final String TAG = "alarmclock.AlarmReceiver";

    @Override
    public void onReceive(Context context, Intent intent) {
        Log.i(TAG, SystemClock.elapsedRealtime() + " in AlarmReceiver onReceive()");
    }
}
我基本上会在10秒钟后触发警报,但由于某种原因,它会立即触发

2020-09-21 22:09:56.664 17910-17910/com.example.alarmclock I/alarmclock.MainActivity: 3362358: scheduling next alarm at 3372358
2020-09-21 22:09:56.687 17910-17910/com.example.alarmclock I/alarmclock.AlarmReceiver: 3362382 in AlarmReceiver onReceive()
如果我使用
setExactAndAllowHileIDLE
,同样的代码似乎可以正常工作。但我特别想尝试
设置闹钟

需要墙时间:

自历元起触发基础报警的时间(以壁时间毫秒为单位)

但是您使用的是
elapsedRealtime()
time,因此请使用
System.currentTimeMillis
来解决此问题。

需要墙时间:

自历元起触发基础报警的时间(以壁时间毫秒为单位)


但是您使用的是
elapsedRealtime()
time,所以请使用
System.currentTimeMillis
来解决此问题。

在我将
SystemClock.elapsedRealtime()
更改为
System.currentTimeMillis()
后,此功能正常

在更详细地阅读了之后,我意识到
AlarmClockInfo
构造函数的第一个参数

长:在墙时间内触发基础报警的时间 从新纪元开始的毫秒

这就是
System.currentTimeMillis()
给出的结果

另一方面,
SystemClock.elapsedRealtime()
返回

自系统启动以来的时间

这将永远是一个小得多的数字比墙的时间,因为时代。因此,警报会立即安排,因为

如果规定的触发时间已过,则会立即触发报警

2020-09-21 22:09:56.664 17910-17910/com.example.alarmclock I/alarmclock.MainActivity: 3362358: scheduling next alarm at 3372358
2020-09-21 22:09:56.687 17910-17910/com.example.alarmclock I/alarmclock.AlarmReceiver: 3362382 in AlarmReceiver onReceive()

在我将
SystemClock.elapsedRealtime()
更改为
System.currentTimeMillis()
后,它工作了

在更详细地阅读了之后,我意识到
AlarmClockInfo
构造函数的第一个参数

长:在墙时间内触发基础报警的时间 从新纪元开始的毫秒

这就是
System.currentTimeMillis()
给出的结果

另一方面,
SystemClock.elapsedRealtime()
返回

自系统启动以来的时间

这将永远是一个小得多的数字比墙的时间,因为时代。因此,警报会立即安排,因为

如果规定的触发时间已过,则会立即触发报警

2020-09-21 22:09:56.664 17910-17910/com.example.alarmclock I/alarmclock.MainActivity: 3362358: scheduling next alarm at 3372358
2020-09-21 22:09:56.687 17910-17910/com.example.alarmclock I/alarmclock.AlarmReceiver: 3362382 in AlarmReceiver onReceive()

不久后发现,并在同一时间发布了答案。但是谢谢你这么快的回复@崇子馨快乐编码:)不久后发现,并在同一时间发布了答案。但是谢谢你这么快的回复@崇子欣快乐编码:)