我需要帮助来理解我使用AlarmManager
在我的应用中实现的逻辑,因为逻辑没有按照我的预期工作。我是Android开发和自学者的新手。
逻辑:
用户使用按钮在主活动中选择一个时间。
该时间值用于在另一项活动中设置重复警报。
当闹钟响起时,会出现一个对话框。
主要活动:
static long ATfrom_to_millisec;
case R.id.ATfrom:
final Calendar ATfromC = Calendar.getInstance();
ATfromHour = ATfromC.get(Calendar.HOUR_OF_DAY);
ATfromMinute = ATfromC.get(Calendar.MINUTE);
// Launch Time Picker Dialog
TimePickerDialog ATfromtpd = new TimePickerDialog(MainActivity.this,
new TimePickerDialog.OnTimeSetListener() {
@Override
public void onTimeSet(TimePicker view, int hourOfDay, int minute) {
//Converting to milli seconds to use in AlarmManager
ATfrom_to_millisec = ((hourOfDay * 60 * 60 * 1000) + (minute * 60 * 1000));
String AM_PM;
if (hourOfDay < 12) {
AM_PM = "AM";
} else {
AM_PM = "PM";
if (hourOfDay > 12) {
hourOfDay = hourOfDay - 12;
}
}
if (minute < 10) {
ATfrom.setText(hourOfDay + ":0" + minute + " " + AM_PM);
} else {
ATfrom.setText(hourOfDay + ":" + minute + " " + AM_PM);
}
在上面的逻辑中,用户选择的时间被转换为毫秒并存储在公共静态变量中,以便其他活动可以使用它。
警报活动:
public void onClick(View arg0) {
// TODO Auto-generated method stub
switch (arg0.getId()){
case R.id.bReminder:
try {
//Receiving the static variable's value from MainActivity
long AT_from = MainActivity.ATfrom_to_millisec;
float cov = (float)(AT_from/1000/60/60);
//Toast to check if the time value is passed correctly
toast.makeText(getApplicationContext(), String.valueOf(cov), toast.LENGTH_SHORT).show();
Intent intent = new Intent(this, Notifier.class);
PendingIntent pendingIntent = PendingIntent.getActivity(this.getApplicationContext(),
12345, intent, 0);
//Logic for Repeating Alarm that uses the time value from MainActivty as starting time and repeating it every 10 seconds.
// i.e. the alarm should go off after 10 seconds from the use selected time and repeat after 10 seconds.
AlarmManager am =
(AlarmManager)getSystemService(Activity.ALARM_SERVICE);
am.setRepeating(AlarmManager.RTC_WAKEUP, AT_from + (10*1000), 10*1000, pendingIntent);
} catch (Exception e) {}
break;
case R.id.bReminderStop:
AlarmManager am =
(AlarmManager)getSystemService(Activity.ALARM_SERVICE);
am.cancel(pendingIntent);
break;
}
}
当使用上述实施的逻辑设置警报时,警报一旦设定就会立即进行,并以1分钟的间隔重复。 但我实现了我的逻辑,期望警报从用户设置的时间开始10秒,并在每10秒后重复一次 我无法理解逻辑中实现的错误。 在吐司中我也没有得到浮点数的十进制值 (例如:11:30 PM必须显示为23.5。但它显示为23.0)
警报响起时对话框活动:
public class Notifier extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(this);
alertDialogBuilder.setTitle("HydrateTime");
alertDialogBuilder.setMessage("Enter the amount of water");
alertDialogBuilder.setPositiveButton("Update", null);
AlertDialog alertDialog = alertDialogBuilder.create();
alertDialog.show();
}
}
我希望在闹钟响起时调用上面的Activity。以上实现的逻辑是否足以在活动结束时显示对话框窗口?
注意:我在Android Manifest中使用了一般活动定义。
喜欢:
<activity
android:name=".Notifier"
android:label="@string/app_name">
</activity
请求以下问题的答案:
答案 0 :(得分:0)
逻辑有一个小缺陷。你会看到,如果已经过了发射时间,则会发出警报,然后警报会立即触发。例如:如果我在1983年1月2日以毫秒为单位设置闹钟,则会立即触发。如果你注意到,你正在做类似的事情。
要解决此问题,只需在Alarm Activity
:
// Will trigger after 10 secs from set time
am.setRepeating(AlarmManager.RTC_WAKEUP, System.currentTimeMillis() + AT_from + (10*1000), 10*1000, pendingIntent);
我不确定导致间隔问题的原因。对我来说似乎很好。