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();

}

また、これらは Calendar を文字列に変換して元に戻すために使用したメソッドです。ここでエラーを起こしたのではないかと思いましたが、メソッドをテストしたところ、機能しました。

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 に答える