了解我的AlarmManager逻辑

时间:2016-08-25 05:29:57

标签: android android-activity dialog alarmmanager

我需要帮助来理解我使用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

请求以下问题的答案:

  1. 我是否正确地将MainActivity中设置的时间值传递给另一个活动中的AlarmManager?
  2. 我的闹钟逻辑中的错误是什么以及如何根据我的要求对其进行纠正?
  3. 对话框的定义是否正确? Manifest中是否还有其他定义?我应该为对话活动创建任何布局文件吗?我应该使用Dialog类而不是Activity类扩展Notifier类吗?

1 个答案:

答案 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);

我不确定导致间隔问题的原因。对我来说似乎很好。