前回に引き続き、目覚ましアプリを作成していきます。
もっと早くブログを更新する予定でしたが、サービスの起動あたりを理解するのに時間がかかってしまいました。
では本題に入っていきましょう。
アラームマネージャ
前回はボタンのON/OFFの切り替えを作成しましたが、
今回はONの時にアラート用の動作を行い、OFFのボタンが押下された時にアラートの処理を解除するようにしましょう。
今回ポイントになってくるのがアラームマネージャ(AlarmManager)です。
「AlarmManager」は一定間隔や指定した時間にサービスを起動するときに使用するクラスです。
「AlarmManager」は起動後の経過時間や指定した時間にインテントを起動するため、
常駐型のサービスを動かすことが出来ます。
まず時間を設定できるように画面に時刻選択の項目を追加します。
時刻選択にはTimePickerを使用します。
res/layout/mail.xml
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="vertical"> <!-- ▼ 追加 =========================== ▼ --> <TimePicker android:id="@+id/time_picker" android:layout_height="wrap_content" android:layout_width="match_parent"> </TimePicker> <!-- ▲ 追加 =========================== ▲ --> <Button android:layout_height="wrap_content" android:id="@+id/btn_on" android:layout_gravity="center" android:text="ON" android:layout_width="141dp" android:enabled="true"> </Button> <Button android:layout_height="wrap_content" android:layout_gravity="center" android:text="OFF" android:id="@+id/btn_off" android:layout_width="141dp" android:enabled="false"> </Button> </LinearLayout>
追加するとこんな感じになります。
次にONボタン押下時に設定した時刻でインテントを起動するようにAlarmManagerを設定します。
同じように、OFFボタンを押下したときはAlarmManagerを解除するように設定します。
package jp.ne.hatena.d.failure_engineer.test_alarm; import android.app.Activity; import android.os.Bundle; import android.view.View; import android.widget.Button; //▼ 追加 =========================== ▼ import java.util.Calendar; import android.widget.TimePicker; import android.app.PendingIntent; import android.app.AlarmManager; import android.content.Context; import android.content.Intent; import android.util.Log; //▲ 追加 =========================== ▲ public class Test_alarmActivity extends Activity { //▼ 追加 =========================== ▼ // アラームマネージャ private AlarmManager alarmManager; // 時間設定 private Calendar calendar_alarm; // 時刻設定クラス private TimePicker timePicker; //▲ 追加 =========================== ▲ /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); // ボタンの設定 final Button alarmOnButton = (Button)findViewById(R.id.btn_on); final Button alarmOffButton = (Button)findViewById(R.id.btn_off); // ONボタンクリックイベント alarmOnButton.setOnClickListener(new Button.OnClickListener() { public void onClick(View v) { alarmOnButton.setEnabled(false); alarmOffButton.setEnabled(true); //▼ 追加 =========================== ▼ // アラート設定 startAlarm(); //▲ 追加 =========================== ▲ } }); // OFFボタンクリックイベント alarmOffButton.setOnClickListener(new Button.OnClickListener() { public void onClick(View v) { alarmOffButton.setEnabled(false); alarmOnButton.setEnabled(true); //▼ 追加 =========================== ▼ // アラート解除 stopAlarm(); //▲ 追加 =========================== ▲ } }); } //▼ 追加 =========================== ▼ // アラームの設定 public void startAlarm() { Log.d("Test_alarmActivity", "startAlarm()"); alarmManager = (AlarmManager)getSystemService(Context.ALARM_SERVICE); // 時間を設定 calendar_alarm = Calendar.getInstance(); // 現在日付の設定 calendar_alarm.setTimeInMillis(System.currentTimeMillis()); // 設定した時刻を取得 timePicker = (TimePicker)findViewById(R.id.time_picker); calendar_alarm.set(Calendar.HOUR_OF_DAY, timePicker.getCurrentHour()); calendar_alarm.set(Calendar.MINUTE, timePicker.getCurrentMinute()); calendar_alarm.set(Calendar.SECOND, 0); calendar_alarm.set(Calendar.MILLISECOND, 0); // アラームマネージャの設定 alarmManager.set(AlarmManager.RTC_WAKEUP, calendar_alarm.getTimeInMillis(), getPendingIntent()); } // アラームの解除 public void stopAlarm() { Log.d("Test_alarmActivity", "stopAlarm()"); // アラームマネージャの解除 alarmManager.cancel(getPendingIntent()); } // インテントの作成 private PendingIntent getPendingIntent() { // サービスの設定 Intent intent = new Intent(getApplicationContext(), Test_alarmActivity.class); PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, intent, 0); return pendingIntent; } //▲ 追加 =========================== ▲ }
実行後に時間を設定すれば、設定した時間にアプリが起動されます。
Post Footer automatically generated by Add Post Footer Plugin for wordpress.
コメントを残す