Androidでアラーム機能とメニュー操作を実装する方法

Androidアプリでアラーム機能を実装するには、TimePickerAlarmManagerを活用します。ユーザーが指定した時刻に通知を表示する仕組みを構築できます。

UIレイアウトの設計

時刻選択とメモ入力用のシンプルなインターフェースをXMLで定義します:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:padding="16dp">

    <TimePicker
        android:id="@+id/picker_time"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center_horizontal" />

    <EditText
        android:id="@+id/input_memo"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:hint="リマインダー内容を入力"
        android:layout_marginTop="24dp" />

    <Button
        android:id="@+id/btn_schedule"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center"
        android:text="アラーム登録"
        android:textSize="18sp"
        android:layout_marginTop="16dp" />
</LinearLayout>

アラームトリガーの設定

ボタンクリック時に指定時刻をカレンダーにセットし、システムのアラームサービスに登録します:

btn_schedule.setOnClickListener(v -> {
    String memo = input_memo.getText().toString().trim();
    if (memo.isEmpty()) return;

    Intent triggerIntent = new Intent(this, ReminderReceiver.class);
    triggerIntent.putExtra("memo", memo);
    
    PendingIntent pending = PendingIntent.getBroadcast(
        this, 0, triggerIntent, PendingIntent.FLAG_IMMUTABLE
    );

    AlarmManager scheduler = (AlarmManager) getSystemService(ALARM_SERVICE);
    Calendar target = Calendar.getInstance();
    target.set(Calendar.HOUR_OF_DAY, picker_time.getHour());
    target.set(Calendar.MINUTE, picker_time.getMinute());
    target.set(Calendar.SECOND, 0);

    scheduler.setExactAndAllowWhileIdle(
        AlarmManager.RTC_WAKEUP,
        target.getTimeInMillis(),
        pending
    );

    Toast.makeText(this, "アラームを登録しました", Toast.LENGTH_SHORT).show();
});

通知ダイアログの表示

アラーム発火時に起動されるアクティビティで、ユーザーにリマインダーを表示します:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_reminder);

    String content = getIntent().getStringExtra("memo");
    if (content == null) content = "リマインダー";

    new AlertDialog.Builder(this)
        .setTitle("⏰ 時間です!")
        .setMessage(content)
        .setPositiveButton("了解", (dialog, which) -> finish())
        .setCancelable(false)
        .show();
}

メニューから削除機能を追加

オプションメニューで「削除」を選択した際の確認ダイアログを表示:

@Override
public boolean onOptionsItemSelected(@NonNull MenuItem item) {
    if (item.getItemId() == R.id.action_remove) {
        new AlertDialog.Builder(this)
            .setTitle("削除確認")
            .setMessage("この項目を削除しますか?")
            .setPositiveButton("はい", (dialog, which) -> {
                setResult(RESULT_OK, new Intent().putExtra("action", "delete"));
                finish();
            })
            .setNegativeButton("いいえ", null)
            .show();
        return true;
    }
    return super.onOptionsItemSelected(item);
}

タグ: Android AlarmManager TimePicker AlertDialog PendingIntent

5月26日 06:43 投稿