투케이2K

132. (AndroidStudio/android/java) AlarmManager 알람 매니저 사용해 지정된 시간에 알림 메시지 표시 실시 본문

Android

132. (AndroidStudio/android/java) AlarmManager 알람 매니저 사용해 지정된 시간에 알림 메시지 표시 실시

투케이2K 2021. 5. 4. 18:36
반응형

/* =========================== */

[ 개발 환경 설정 ]

개발 툴 : AndroidStudio

개발 언어 : java

/* =========================== */

/* =========================== */

[소스 코드]

[AndroidManifest.xml 파일]

<퍼미션 등록 부분>
<uses-permission android:name="android.permission.WAKE_LOCK" />


<액티비티 등록 부분>
<activity
            android:name=".A_Alarm"
            android:screenOrientation="portrait"
            android:windowSoftInputMode="adjustPan"/>



<브로드캐스트 등록 부분>
<receiver
	android:name=".A_AlarmReceiver"
	android:enabled="true"
	android:exported="true"/>

 

[JAVA 파일 : A_Alarm]

    //TODO [알림 등록 실시 메소드]
    public void setAlarmSetting(String year, String month, String day, String hour, String minute, String second){
        String str_date = "";
        //TODO [2021-05-04 11:35:12] 형태
        str_date = String.valueOf(year+"-"+month+"-"+day+" "+hour+":"+minute+":"+second);
        Log.d("---","---");
        Log.d("//===========//","================================================");
        Log.d("","\n"+"[A_Alarm > setAlarmSetting() 메소드 : 알람 등록 수행 실시]");
        Log.d("","\n"+"[날짜 : "+str_date+"]");
        Log.d("//===========//","================================================");
        Log.d("---","---");
        try {
            String now = getNowTime2();
            int result = str_date.compareTo(now);
            if(result < 0){ //TODO 저장하려는 시간이 현재시간보다 작은 경우
                getAlertDialog("알람 설정",
                        "\n"+"[설정하려는 알람 시간을 다시 확인해주세요]"+"\n"+"\n"+
                                "[현재 날짜]"+"\n"+String.valueOf(now)+"\n"+"\n"+
                                "[예약할 날짜]"+"\n"+String.valueOf(str_date),
                        "확인",
                        "취소",
                        "");
            }
            else{
                //TODO [알림 매니저 객체 생성]
                AlarmManager alarmManager  = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
                Calendar calendar = Calendar.getInstance();

                //TODO [인텐트 등록]
                Intent intent = new Intent(A_Alarm.this, A_AlarmReceiver.class);
                PendingIntent pendingIntent = PendingIntent.getBroadcast(A_Alarm.this, 1, intent, 0);

                //TODO [캘린더에 알림 날짜 저장 실시]
                SimpleDateFormat simpleDateFormat =  new SimpleDateFormat("yyyy-MM-dd kk:mm:ss", Locale.KOREA);
                try {
                    Date date = simpleDateFormat.parse(str_date);
                    calendar.setTime(date);
                } catch (ParseException e) {
                    e.printStackTrace();
                }

                Log.d("---","---");
                Log.w("//===========//","================================================");
                Log.d("","\n"+"[A_Alarm > setAlarmSetting() 메소드 : 알람 등록 수행 실시]");
                Log.d("","\n"+"[Calendar : "+calendar.toString()+"]");
                Log.w("//===========//","================================================");
                Log.d("---","---");

                //TODO [알림 등록 실시]
                if (Build.VERSION.SDK_INT >= 23) { //TODO 23보다 큰 경우
                    alarmManager.setExactAndAllowWhileIdle(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), pendingIntent); //TODO 버전 23 이상
                }
                else { //TODO 23보다 크지 않은 경우
                    if(Build.VERSION.SDK_INT >= 19){ //TODO 19보다 큰 경우
                        alarmManager.setExact(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), pendingIntent); //TODO 버전 19 이상
                    }
                    else { //TODO 19보다 크지 않은 경우
                        alarmManager.set(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), pendingIntent); //TODO 버전 19 미만
                    }
                }

                S_Preference.setString(getApplication(), "Alarm_Date", str_date);

                getAlertDialog("알람 설정",
                        "\n"+"[알림이 정상적으로 예약되었습니다]"+"\n"+"\n"+S_Preference.getString(getApplication(), "Alarm_Date"),
                        "확인",
                        "취소",
                        "");
            }
        }
        catch (Exception e){
            e.printStackTrace();
        }
    }
    //TODO [알림 등록 취소 메소드]
    public void setAlarmCancle(){
        Log.d("---","---");
        Log.e("//===========//","================================================");
        Log.d("","\n"+"[A_Alarm > setAlarmCancle() 메소드 : 알람 등록 해제 실시]");
        Log.e("//===========//","================================================");
        Log.d("---","---");
        String save = S_Preference.getString(getApplication(), "Alarm_Date");
        try {
            if(save != null && save.length() > 0 && !save.equals("") && !save.contains("null")){
                String now = getNowTime2();
                int result = save.compareTo(now);
                if(result < 0){ //TODO 저장된 시간이 현재 시간보다 작은 경우 (비정상)
                    getAlertDialog("알람 해제",
                            "\n"+"[알람 해제할 시간을 다시 확인해주세요]"+"\n"+"\n"+
                                    "[현재 날짜]"+"\n"+String.valueOf(now)+"\n"+"\n"+
                                    "[저장된 날짜]"+"\n"+S_Preference.getString(getApplication(), "Alarm_Date"),
                            "확인",
                            "취소",
                            "");
                }
                else { //TODO 저장된 시간이 현재 시간보다 큰 경우 (정상)
                    //TODO [알림 매니저 객체 생성]
                    AlarmManager alarmManager  = (AlarmManager) getSystemService(Context.ALARM_SERVICE);

                    //TODO [인텐트 해제]
                    Intent intent = new Intent(A_Alarm.this, A_AlarmReceiver.class);
                    PendingIntent pendingIntent = PendingIntent.getBroadcast(A_Alarm.this, 1, intent, 0);
                    alarmManager.cancel(pendingIntent);
                }
            }
            else {
                getAlertDialog("알람 해제",
                        "\n"+"[등록된 알람 설정이 없습니다]",
                        "확인",
                        "취소",
                        "");
            }
        }
        catch (Exception e){
            e.printStackTrace();
        }
    }

 

[JAVA 파일 : A_AlarmReceiver]

package kr.co.two2k.manager;

import android.app.AlertDialog;
import android.app.Notification;
import android.app.NotificationChannel;
import android.app.NotificationManager;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.graphics.BitmapFactory;
import android.os.Build;
import android.os.PowerManager;
import android.util.Log;
import android.widget.Toast;

import androidx.core.app.NotificationCompat;
import androidx.core.content.ContextCompat;

public class A_AlarmReceiver extends BroadcastReceiver {

    //TODO [클래스 전역 변수 선언 부분]
    Context mContext;

    //TODO [onReceive 메소드를 재정의 (채널 알림 메시지 확인 부분)]
    @Override
    public void onReceive(Context context, Intent intent) {
        try {
            mContext = context;
            Log.d("---","---");
            Log.w("//===========//","================================================");
            Log.d("","\n"+"[A_AlarmReceiver > onReceive() 메소드 : 수신받은 알림 내용 확인]");
            Log.w("//===========//","================================================");
            Log.d("---","---");

            //TODO 노티피케이션 알림 호출 실시
            Toast.makeText(mContext,S_Preference.getString(mContext, "Alarm_Date")+" [알림]",Toast.LENGTH_SHORT).show();
            serviceContent = S_Preference.getString(mContext, "Alarm_Date");
            setNotificationShow();
        }
        catch (Exception e){
            e.printStackTrace();
        }
    }
}

/* =========================== */

/* =========================== */

[결과 출력]

/* =========================== */

/* =========================== */

[파일 첨부 : 전체 소스코드]

 

소스코드.txt
0.04MB

/* =========================== */

반응형
Comments