29203


現在、AlarmManagerを使い指定した日時に通知を出すアプリを制作しています。  
しかし、指定する日時が多く一つ一つに年、月、日、時を指定するとコードがとても長くなり管理しにくくなってしまいます。  
そこで日時の指定を短くしたり、１行で指定する方法を探しています。  
どうしたら良いでしょうか？  
ちなみに繰り返しで処理をすることは指定日に法則性がないために指定できません

以下サンプルコード

[code]

        Intent intent0 = new Intent(getApplicationContext(), AlarmReceiver.class);
        intent0.setType("intent0");
        PendingIntent sender0 = PendingIntent.getBroadcast(getApplicationContext(), 0, intent0, 0);
    
        Calendar calendar0 = Calendar.getInstance();
        calendar0.set(Calendar.YEAR, 2016);
        calendar0.set(Calendar.MONTH, Calendar.SEPTEMBER);
        calendar0.set(Calendar.DATE, 27);
        calendar0.set(Calendar.HOUR_OF_DAY, 12);
        calendar0.set(Calendar.MINUTE, 00);
        calendar0.set(Calendar.SECOND, 0);
        calendar0.set(Calendar.MILLISECOND, 0);
    
        AlarmManager alarmManager0 = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
        alarmManager0.set(AlarmManager.RTC_WAKEUP, calendar0.getTimeInMillis(), sender0);
    
    
        Intent intent1 = new Intent(getApplicationContext(), AlarmReceiver.class);
        intent1.setType("intent1");
        PendingIntent sender1 = PendingIntent.getBroadcast(getApplicationContext(), 0, intent1, 0);
    
        Calendar calendar1 = Calendar.getInstance();
        calendar1.set(Calendar.YEAR, 2016);
        calendar1.set(Calendar.MONTH, Calendar.SEPTEMBER);
        calendar1.set(Calendar.DATE, 27);
        calendar1.set(Calendar.HOUR_OF_DAY, 12);
        calendar1.set(Calendar.MINUTE, 40);
        calendar1.set(Calendar.SECOND, 0);
        calendar1.set(Calendar.MILLISECOND, 0);
    
        AlarmManager alarmManager = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
        alarmManager.set(AlarmManager.RTC_WAKEUP, calendar1.getTimeInMillis(), sender1);
    
[/code]


CC BY-SA 3.0
2016-09-27T13:58:11.547
29189
2016-09-28T04:43:14.580
18936
question
android android-layout
AlarmManagerで複数日時を指定する場合の短縮方法について


単に重複する部分をユーティリティクラスにまとめれば良いと思います。以下に例を挙げますが、動作テストはしていません。

[code]

    public class Sample_Util {
    // //////////////////////////////////////////コンストラクタなど
    // インスタンス化を防ぐために、デフォルトコンストラクタを抑制する。
    private Sample_Util() {
    // 間違ってインスタンスを生成した場合、コンストラクタで例外が返される。
    throw new AssertionError();
    }
    // //////////////////////////////////////////メソッド
    /**
     * 指定した日時のカレンダーを取得します。
     *
     * @param y
     * :年
     * @param m
     * :月
     * @param d
     * :日
     * @param h
     * :時間
     * @param min
     * :分
     * @param sec
     * :秒
     * @param msec
     * :ミリ秒
     */
    public static Calendar get_calendar(int y, int m, int d, int h, int min,
    int sec, int msec) {
    Calendar calendar = Calendar.getInstance();
    calendar.set(Calendar.YEAR, y);
    calendar.set(Calendar.MONTH, m);
    calendar.set(Calendar.DATE, d);
    calendar.set(Calendar.HOUR_OF_DAY, h);
    calendar.set(Calendar.MINUTE, min);
    calendar.set(Calendar.SECOND, sec);
    calendar.set(Calendar.MILLISECOND, msec);
    return calendar;
    }
    }
    
[/code]

これを利用すると、提示されたコードは以下のように短縮できます。

[code]

     Intent intent0 = new Intent(getApplicationContext(), AlarmReceiver.class);
     intent0.setType("intent0");
     PendingIntent sender0 = PendingIntent.getBroadcast(getApplicationContext(), 0, intent0, 0);
    
     Calendar calendar0 = Sample_Util.get_calendar(2016,Calendar.SEPTEMBER,27,12,0,0,0);
    
     AlarmManager alarmManager0 = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
     alarmManager0.set(AlarmManager.RTC_WAKEUP, calendar0.getTimeInMillis(), sender0);
    
     Intent intent1 = new Intent(getApplicationContext(), AlarmReceiver.class);
     intent1.setType("intent1");
     PendingIntent sender1 = PendingIntent.getBroadcast(getApplicationContext(), 0, intent1, 0);
    
     Calendar calendar1 = Sample_Util.get_calendar(2016,Calendar.SEPTEMBER,27,12,40,0,0);
    
     AlarmManager alarmManager = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
     alarmManager.set(AlarmManager.RTC_WAKEUP, calendar1.getTimeInMillis(), sender1);
    
[/code]

なお、用途によっては、ユーティリティでカレンダー以外、つまりアラーム部分まで含めるのもありだと思います。この場合、コードは更に短くできるでしょう。この辺はコードの再利用について考慮するのが大事です。


CC BY-SA 3.0
2016-09-28T04:43:14.580
29203
2016-09-28T04:43:14.580
8795
29189
answer