Android Alarm会在创建后立即启动

时间:2012-10-23 00:28:31

标签: android android-intent timepicker android-pendingintent

编辑:我已经发现当你在当前时间之前将警报设置一段时间时它会立即关闭

我正在创建一个警报应用程序,它具有用于创建警报的活动,然后将其注册到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());
}

我的 问题是,一旦你创建了警报,它就会熄灭。 如果你改变时间,我也会看到一些奇怪的行为进行进一步的测试。时间选择器 之前你更改了它在正确时间关闭的名称,如果不是它就会在创建后立即关闭。我不知道该怎么做才知道,因为我不知道问题是什么。

也感谢您抽出宝贵时间阅读我的问题。

1 个答案:

答案 0 :(得分:0)

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