●指定した時間に処理を実行する

指定した時間にある処理を実行するにはAlarmManagerを使います。
実行してスケジュールを設定したアプリケーションが終了しても時間になれば処理が実行されます。
まさにアラームで処理をするという感じです。

まずは通常のアプリケーションに対してtest.javaというファイルを追加しました。



あまり変な所にファイルを追加するとややこしい事になります。
そのファイルの中に次の赤文字部分を書き込みます。
ただし、パッケージ名部分は自身のプロジェクトに合わせて書き換えてください。

package test.myapplication;

public class test extends android.content.BroadcastReceiver {
    public void onReceive(android.content.Context context, android.content.Intent intent) {
        android.media.ToneGenerator tg;
        tg = new android.media.ToneGenerator(android.media.AudioManager.STREAM_SYSTEM, android.media.ToneGenerator.MAX_VOLUME);
        tg.startTone(android.media.ToneGenerator.TONE_SUP_ERROR,50);
    }
}
上のプログラムでは少しの時間だけ音を鳴らす処理をしています。


次にAndroidManifest.xmlを開きます。
赤文字部分を追加してください。
赤文字部分がandroidから送られた信号を受信するレシーバーです。
レシーバー部分は必ず、<application>タグの中に書き込んでください。
他の部分に書き込んでも動作しませんので。

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="test.myapplication">

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">

        <receiver android:name=".test" android:process=":remote" />


        <activity android:name=".MainActivity">
            <intent-filter>
            </intent-filter>
        </activity>
    </application>

</manifest>

これで、アラームを受信する準備は整いました。
次に、アラームを設定します。
AlarmManagerにスケジュールとして渡す時間は1970年1月1日からの経過ミリ秒で渡します。
現在時間がこれより大きい場合には即座にアラームが鳴ります。

//現在の時間を取得
java.util.Calendar calendar = java.util.Calendar.getInstance();

//実行先のクラスを指定
android.content.Intent intent = new android.content.Intent(getApplicationContext(), test.class);
android.app.PendingIntent pendingIntent = android.app.PendingIntent.getBroadcast(getApplicationContext(), 0, intent, android.app.PendingIntent.FLAG_CANCEL_CURRENT);

//アラームをミリ秒+10000で10秒後にスケジュールする
android.app.AlarmManager am = (android.app.AlarmManager) getSystemService(ALARM_SERVICE);
am.set(android.app.AlarmManager.RTC, calendar.getTimeInMillis()+10000 , pendingIntent);
このプログラムを実行するとアプリを終了しても画面を消していても約10秒後に音が鳴るはずです。


■日時を指定してアラームを鳴らす

日時を指定するにはCalendarの日時を設定してミリ秒を渡すだけです。

java.util.Calendar calendar = java.util.Calendar.getInstance();

calendar.setTimeInMillis(0);
calendar.set(2017,6-1,24,21,40,10);

android.content.Intent intent = new android.content.Intent(getApplicationContext(), test.class);
android.app.PendingIntent pendingIntent = android.app.PendingIntent.getBroadcast(getApplicationContext(), 0, intent, android.app.PendingIntent.FLAG_CANCEL_CURRENT);

android.app.AlarmManager am = (android.app.AlarmManager) getSystemService(ALARM_SERVICE);
am.set(android.app.AlarmManager.RTC, calendar.getTimeInMillis(), pendingIntent);
赤文字の部分で日時を指定しています
2017年6月24日21時40分10秒で設定しています。
ただし、月の部分は、1月を数字の0として表現しますので注意が必要です。


■複数のアラームを設定する

上のプログラムではPendingIntent.getBroadcastの第四引数にFLAG_CANCEL_CURRENTを設定しているので、複数回アラームの設定をすると新しいものに更新されてしまい、 複数のアラームを設定できません。
そこで、PendingIntent.getBroadcastの第二引数のrequestCodeに設定毎に違う値を入れる事により複数のアラームを設定できます。

android.app.PendingIntent pendingIntent = android.app.PendingIntent.getBroadcast(getApplicationContext(), 0, intent, android.app.PendingIntent.FLAG_CANCEL_CURRENT);
requestCodeはアプリケーション内で重複しないようにする必要があるだけで、他のアプリケーションと重複しても問題ありません。


▲トップページ > android