0

编辑:我发现当您在当前时间之前设置警报时,它会立即响起

我正在创建一个警报应用程序,该应用程序具有用于创建警报的活动,然后将其注册到 android 系统。我遇到的问题是,一旦您创建警报,它就会消失。我还在进一步的测试中看到了一些奇怪的行为,如果您在更改名称之前更改时间选择器中的时间,它会在正确的时间关闭,如果不是,它会在创建后立即关闭。这是我的警报类,用于为警报创建待处理的意图(至少是重要部分):

public class Alarm {
private String name;
private int id;
private Calendar time;
private boolean on = true;

public Alarm(String name, int id, Calendar time) {
    this.setName(name);
    this.setId(id);
    this.setTime(time);
}

public Alarm() {

}

    ...
public PendingIntent createPendingIntent(Context context) {
      Intent intent = new Intent(context, MathAlarmReceiverActivity.class);
      intent.putExtra("name", getName());
        PendingIntent pendingIntent = PendingIntent.getActivity(context,
            id, intent, PendingIntent.FLAG_CANCEL_CURRENT);
        return pendingIntent;
}


    ...

}

我认为问题可能出在我创建意图的位置,但是当我在更改名称之前更改时间选择器中的时间时,它在正确的时间消失了,所以我能够排除这种情况。

接下来我的活动实际上有时间选择器:

public class EditActivity extends Activity {

    public static int CODE_EDIT = 100;
    public static int CODE_ADD = 101;
    Button doneButton;
    TimePicker tp;
    EditText editName;


    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_edit);
        doneButton = (Button) findViewById(R.id.buttonDone);
        doneButton.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View v) {
                done();

            }
        });
        tp = (TimePicker) findViewById(R.id.timePicker);
        editName = (EditText) findViewById(R.id.editTextAlarmName);

        if (getIntent().getExtras().getInt("requestCode") == CODE_ADD) {
            setTitle("Add Alarm");
            doneButton.setText("Add Alarm");
        } else {
            doneButton.setText("Edit Alarm");
            editName.setText(getIntent().getExtras().getString("name"));
            Calendar c = TimeUtils.stringToCalendar(getIntent().getExtras().getString("time"));
            tp.setCurrentHour(c.get(Calendar.HOUR_OF_DAY));
            tp.setCurrentMinute(c.get(Calendar.MINUTE));

            setTitle("Edit Alarm");

        }
        if (android.os.Build.VERSION.SDK_INT > 10) {

            getActionBar().setDisplayHomeAsUpEnabled(true);
        }
    }

       ...

    private void done() {
        String name = editName.getText().toString().trim();
        Calendar c = Calendar.getInstance();
        c.set(Calendar.HOUR_OF_DAY, tp.getCurrentHour());
        c.set(Calendar.MINUTE, tp.getCurrentMinute());
        String time = TimeUtils.calendarToString(c);
        if (name.length() == 0) {
            AlertDialog.Builder b = new AlertDialog.Builder(this);
            b.setMessage("Please enter an alarm name!");
            b.setNeutralButton("Ok", null);
            b.show();
        } else {
            Intent returnIntent = new Intent();
            returnIntent.putExtra("name", name);
            returnIntent.putExtra("time", time);
            if (getIntent().getExtras().getInt("requestCode") == CODE_EDIT) {
                returnIntent.putExtra("id", getIntent().getExtras()
                        .getInt("id"));
                returnIntent.putExtra("on",
                        getIntent().getExtras().getBoolean("on"));
            }

            setResult(RESULT_OK, returnIntent);
            finish();
        }
    }



    ...

}

然后我想,也许当我没有这样做时,它会以某种方式改变时间选择器中的内容,但我不确定这是怎么发生的!在这里,我有将警报添加到 android 系统的方法:

protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    if (resultCode == RESULT_OK) {
        if (requestCode == EditActivity.CODE_EDIT) {
            dataSource.update_byID(
                    data.getExtras().getInt("id"),
                    TimeUtils.stringToCalendar(data.getExtras().getString(
                            "time")), data.getExtras().getString("name"),
                    data.getExtras().getBoolean("on"));
            AlarmManager am = (AlarmManager) getSystemService(Activity.ALARM_SERVICE);
            for(int i = 0; i < dataSource.getAllAlarms().size(); i++) {
                if(dataSource.getAllAlarms().get(i).getId() == data.getExtras().getInt("id")) {
                    Alarm tempAlarm = dataSource.getAllAlarms().get(i);
                    am.setRepeating(AlarmManager.RTC_WAKEUP, tempAlarm.getTime()
                            .getTimeInMillis(), AlarmManager.INTERVAL_DAY, tempAlarm
                            .createPendingIntent(this));
                    break;

                }
            }
        }

        if (requestCode == EditActivity.CODE_ADD) {
            Alarm tempAlarm = dataSource.createAlarm(
                    data.getExtras().getString("name"),
                    TimeUtils.stringToCalendar(data.getExtras().getString(
                            "time")));
            AlarmManager am = (AlarmManager) getSystemService(Activity.ALARM_SERVICE);
            am.setRepeating(AlarmManager.RTC_WAKEUP, tempAlarm.getTime()
                    .getTimeInMillis(), AlarmManager.INTERVAL_DAY, tempAlarm
                    .createPendingIntent(this));

        }
    }
    refreshList();

}

这些也是我用来将日历转换为字符串并返回的方法,我想也许我在这里犯了一个错误,但我测试了这些方法并且它们有效:

public static String calendarToString(Calendar c) {
    return String.valueOf(c.get(Calendar.HOUR)) + ":"
            + getMinuteInReadableFormat(c.get(Calendar.MINUTE))
            + (((c.get(Calendar.AM_PM)) == Calendar.AM) ? "AM" : "PM");
}

public static Calendar stringToCalendar(String s) {
    String[] t = s.split(":");
    Calendar c = Calendar.getInstance();
    c.set(Calendar.HOUR, Integer.valueOf(t[0]));
    c.set(Calendar.MINUTE, minuteToInt(t[1]));
    c.set(Calendar.AM_PM, (t[1].endsWith("AM") ? Calendar.AM : Calendar.PM));
    return c;
}

public static String convert12(String s) {
    String newString = null;
    if (s.startsWith("0")) {
        newString = s.replaceFirst("0", "12");
    }
    if (newString == null) {
        return s;
    } else {
        return newString;
    }
}

private static String getMinuteInReadableFormat(int m) {
    if (m < 10) {
        return "0" + String.valueOf(m);
    } else {
        return String.valueOf(m);
    }
}

private static int minuteToInt(String m) {
    String x = m;
    if (m.startsWith("0")) {
        x = m.replaceFirst("0", "");
    }
    String y = x.replace("AM", "");
    String z = y.replace("PM", "");
    return Integer.valueOf(z.trim());
}

我的问题是,一旦您创建警报,它就会消失。我还在进一步的测试中看到了一些奇怪的行为,如果您在更改名称之前更改时间选择器中的时间,它会在正确的时间关闭,如果不是,它会在创建后立即关闭。而且我不确定该怎么做,因为我不知道问题出在哪里。

也感谢您花时间阅读我的问题。

4

1 回答 1

0

好吧,我已经解决了这个问题。对于任何有类似问题的人来说,这里就是解决方案。当我在比当前时间更早的时间创建警报时,它会立即响起。解决方案是在设置闹钟时将相当于 24 小时的时间添加到您想要的时间。

于 2012-10-23T22:43:55.103 回答