我的应用程序就像这样工作,用户以分钟为单位记下时间,例如40秒。然后应用程序将在40分钟后拨打警报。无论应用程序处于活动状态还是在后台运行,它都无关紧要。
我的问题是这个,因为我使用的方法是System.currentTimeMillis();然后它使我的应用程序依赖于系统时间。因此,如果我在设置中更改系统时间,那么我的闹钟应用程序将不会在设定的时间内被调用,它将会改变。
例如:如果时间是上午10:00,我设置闹钟在20分钟后被调用,那么它将在上午10点20分被调用。但是,如果我在设置闹钟后进入设置并将系统时间更改为上午9:00,那么我的应用程序将从现在起100分钟后调用。我如何防止这种情况发生,以便在设置闹钟时间和系统时间之后,将在这些分钟后调用闹钟。
这是我的代码:
import org.apache.hadoop.fs.{FileAlreadyExistsException, FileSystem, FileUtil, Path}
val srcFileSystem: FileSystem = FileSystemUtil
.apply(spark.sparkContext.hadoopConfiguration)
.getFileSystem(sourceFile)
val dstFileSystem: FileSystem = FileSystemUtil
.apply(spark.sparkContext.hadoopConfiguration)
.getFileSystem(sourceFile)
FileUtil.copy(
srcFileSystem,
new Path(new URI(sourceFile)),
dstFileSystem,
new Path(new URI(targetFile)),
true,
spark.sparkContext.hadoopConfiguration)
设法用
解决了这个问题public void newSetAlarm(View view) {
timeEntered = Integer.parseInt(editTextForTime.getText().toString());
Intent AlarmIntent = new Intent(this, Alarm.class);
AlarmIntent.putExtra(TIME_LEFT, timeEntered);
pendingIntentForAlarm = PendingIntent.getBroadcast(getApplicationContext(), 0, AlarmIntent, 0);
amAlarm = (AlarmManager) getSystemService(ALARM_SERVICE);
amAlarm.set(AlarmManager.RTC_WAKEUP, System.currentTimeMillis() + timeEntered * 60000, pendingIntentForAlarm);}
清单文件中的然后创建该类
<receiver android:name=".TimeChangeBroadcastReceiver">
<intent-filter>
<action android:name="android.intent.action.TIME_SET"/>
<action android:name="android.intent.action.TIMEZONE_CHANGED"/>
</intent-filter>
现在的问题是,每当我更改设置中的时间时,都会调用此广播接收器。但是我只希望在我的闹钟响起时调用它,并且用户前往设置更改时间。当没有闹钟,并且用户在设置中更改时间时,我不希望广播接收器在后台运行。
我该如何解决
答案 0 :(得分:0)
而不是在设置闹钟时使用RTC_WAKEUP
,而是使用ELAPSED_REALTIME_WAKEUP
。确保在NOW和您希望警报触发的时间之间提供增量作为“触发”时间而不是时钟时间。
自设备启动以来经过的实时测量时间。当设备的时钟发生变化时,它不会改变。如果你这样做,你不需要处理时钟或时区的变化。
阅读https://developer.android.com/reference/android/os/SystemClock,了解有关您可以使用的不同时钟以及您应该针对哪种情况使用的时钟的详细信息。