【androidアプリ開発 No.11】

Pocket

前回に引き続き、目覚ましアプリを作成していきます。

もっと早くブログを更新する予定でしたが、サービスの起動あたりを理解するのに時間がかかってしまいました。

では本題に入っていきましょう。

アラームマネージャ

前回はボタンの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>

追加するとこんな感じになります。

f:id:failure-engineer:20111010233300p:image

次に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.

びのっち

関東圏で活動しているとてもマイペースなSEです。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

*