상세 컨텐츠

본문 제목

[안드로이드]정해진 시간에 알람 울리는 방법 Notification TimePicker

안드로이드

by aries574 2021. 6. 28. 15:55

본문


2020.12.25 - [안드로이드] - [안드로이드]Notification 간단한 알림 띄우기

 

[안드로이드]Notification 간단한 알림 띄우기

2020/12/24 - [안드로이드] - [안드로이드]DatePicker 달력(캘린더) 만들어보기 이번 시간에는 간단한 알림 메시지를 띄우는 앱을 만들어 보겠습니다. 사용자가 직접 제목과 내용을 입력하고 버튼을 누

aries574.tistory.com

2020.12.28 - [안드로이드] - [안드로이드]Notification 알림창에 액션기능 추가하기

 

[안드로이드]Notification 알림창에 액션기능 추가하기

2020/12/25 - [안드로이드] - [안드로이드]Notification 간단한 알림 띄우기 이번 시간에는 알림창에 액션버튼을 추가해보도록 하겠습니다. 알림내용 하단에 yes, no 라는 단어를 추가해서 클릭하면 해당

aries574.tistory.com

 

이번 시간에는 사용자가 정한 시간에 알람이 울리는 앱을 만들어 보려고 합니다.

1.TimePicker를 통해서 시계를 띄우고 알람 시간을 정한다.

2. AlarmManager를 통해 정해진 시간이 되면 알람으로 알려준다. 

 

1. 메인화면(activity_main.xml)

화면구성은 사용자가 선택한 시간을 보여줄 TextView, 시계를 보여주는 TimePicker를 띄어줄 버튼,

알람을 취소할 버튼 이렇게 되어있습니다.

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    <TextView
        android:id="@+id/time_text"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerVertical="true"
        android:layout_centerHorizontal="true"
        android:textColor="@color/black"
        android:text="time"
        android:textSize="30sp"
        >
    </TextView>

    <Button
        android:id="@+id/time_btn"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_below="@+id/time_text"
        android:layout_centerHorizontal="true"
        android:text="시간 지정"
        >
    </Button>

    <Button
        android:id="@+id/alarm_cancel_btn"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_below="@+id/time_btn"
        android:layout_centerHorizontal="true"
        android:text="알람 취소"
        >
    </Button>
</RelativeLayout>

 

2. 알람기능 (NotificationHelper.java)

import android.app.Notification;
import android.app.NotificationChannel;
import android.app.NotificationManager;
import android.content.Context;
import android.content.ContextWrapper;
import android.os.Build;

import androidx.annotation.RequiresApi;
import androidx.core.app.NotificationCompat;

public class NotificationHelper extends ContextWrapper {

    public static final String channeID = "channelID";
    public static final String channeNm = "channelNm";

    private NotificationManager notiManager;

    public NotificationHelper(Context base) {
        super(base);

        //안드로이드 버전이 오레오거나 이상이면 채널생성성
       if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.O){
            createChannels();
        }
    }

    @RequiresApi(api = Build.VERSION_CODES.O)
    public void createChannels(){

        NotificationChannel channel1 = new NotificationChannel(channeID, channeNm, NotificationManager.IMPORTANCE_DEFAULT);
        channel1.enableLights(true);
        channel1.enableVibration(true);
        channel1.setLightColor(R.color.design_default_color_on_primary);
        channel1.setLockscreenVisibility(Notification.VISIBILITY_PRIVATE);

        getManager().createNotificationChannel(channel1);
    }

    public NotificationManager getManager(){
        if(notiManager == null){
            notiManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
        }
        return notiManager;
    }

    public NotificationCompat.Builder getChannelNotification(){

        return new NotificationCompat.Builder(getApplicationContext(), channeID)
                .setContentTitle("알람")
                .setContentText("알람매니저 실행중")
                .setSmallIcon(R.drawable.ic_launcher_background);
    }
}

 

3. 시계 (TimePickerFragment.java)

import android.app.Dialog;
import android.app.TimePickerDialog;
import android.os.Bundle;
import android.text.format.DateFormat;
import androidx.fragment.app.DialogFragment;
import java.util.Calendar;

public class TimePickerFragment extends DialogFragment {

    @Override
    public Dialog onCreateDialog(Bundle savedInstanceState) {

        Calendar c = Calendar.getInstance();
        int hour = c.get(Calendar.HOUR_OF_DAY);
        int minute = c.get(Calendar.MINUTE);

        return new TimePickerDialog(getActivity(), (TimePickerDialog.OnTimeSetListener) getActivity(), hour, minute, DateFormat.is24HourFormat(getActivity()));
    }

}

 

4. 전달기능 (AlertReceiver.java)

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import androidx.core.app.NotificationCompat;

public class AlertReceiver  extends BroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent) {

        NotificationHelper notificationHelper = new NotificationHelper(context);
        NotificationCompat.Builder nb = notificationHelper.getChannelNotification();
        notificationHelper.getManager().notify(1, nb.build());
    }
}

 

5. BroadcastReceiver 정의해주기

AndroidManifest.xml

receiver 태그에 방금 만든 AlertReceiver 파일을 등록합니다.

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

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/Theme.TimePicker">
        <activity
            android:name=".MainActivity"
            android:exported="true">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

        <receiver android:name=".AlertReceiver"/>
    </application>

</manifest>

 

6. 메인코드(MainActivity.java)

import androidx.appcompat.app.AppCompatActivity;
import androidx.fragment.app.DialogFragment;
import android.app.AlarmManager;
import android.app.PendingIntent;
import android.app.TimePickerDialog;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
import android.widget.TimePicker;
import java.text.DateFormat;
import java.util.Calendar;


public class MainActivity extends AppCompatActivity implements  TimePickerDialog.OnTimeSetListener{

    public static final String TAG = "MAIN";

    private TextView time_text;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        time_text = findViewById(R.id.time_text);

        Button time_btn = findViewById(R.id.time_btn);

        //시간 설정
        time_btn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                DialogFragment timePicker = new TimePickerFragment();
                timePicker.show(getSupportFragmentManager(), "time picker");
           }
        });

        //알람 취소
        Button alarm_cancel_btn = findViewById(R.id.alarm_cancel_btn);
        alarm_cancel_btn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                cancelAlarm();
            }
        });
    }


    /**
     * 시간을 정하면 호출되는 메소드
     * @param view 화면
     * @param hourOfDay 시간
     * @param minute 분
     */
    @Override
    public void onTimeSet(TimePicker view, int hourOfDay, int minute) {

        Log.d(TAG, "## onTimeSet ## ");
        Calendar c = Calendar.getInstance();

        c.set(Calendar.HOUR_OF_DAY, hourOfDay);
        c.set(Calendar.MINUTE, minute);
        c.set(Calendar.SECOND, 0);

        //화면에 시간지정
        updateTimeText(c);

        //알람설정정
       startAlarm(c);
    }

    /**
     * 화면에 사용자가 선택한 시간을 보여주는 메소드
     * @param c 시간
     */
    private void updateTimeText(Calendar c){

        Log.d(TAG, "## updateTimeText ## ");
        String timeText = "알람시간: ";
        timeText += DateFormat.getTimeInstance(DateFormat.SHORT).format(c.getTime());
        time_text.setText(timeText);
    }

    /**
     * 알람 시작
     * @param c 시간
     */
    private void startAlarm(Calendar c){
        Log.d(TAG, "## startAlarm ## ");
        AlarmManager alarmManager = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
        Intent intent = new Intent(this, AlertReceiver.class);
        PendingIntent pendingIntent = PendingIntent.getBroadcast(this, 1, intent, 0);

        if(c.before(Calendar.getInstance())){
            c.add(Calendar.DATE, 1);
        }

        //RTC_WAKE : 지정된 시간에 기기의 절전 모드를 해제하여 대기 중인 인텐트를 실행
        alarmManager.setExact(AlarmManager.RTC_WAKEUP, c.getTimeInMillis(), pendingIntent);

    }

    /**
     * 알람 취소
     */
    private void cancelAlarm(){
        Log.d(TAG, "## cancelAlarm ## ");
        AlarmManager alarmManager = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
        Intent intent = new Intent(this, AlertReceiver.class);
        PendingIntent pendingIntent = PendingIntent.getBroadcast(this, 1, intent, 0);

        alarmManager.cancel(pendingIntent);
        time_text.setText("알람 취소");
    }
}

7. 실행화면

2021.01.23 - [안드로이드] - [안드로이드] 안드로이드 스튜디오 기본 색상 코드에서 가져오는 방법

 

[안드로이드] 안드로이드 스튜디오 기본 색상 코드에서 가져오는 방법

2021/01/19 - [안드로이드] - [안드로이드]DrawerLayout Navigation 메뉴(Menu) 추가하기 2021/01/20 - [안드로이드] - [안드로이드]DrawerLayout Navigation Header 추가하기 2021/01/21 - [안드로이드] - [안드..

aries574.tistory.com

2021.01.19 - [안드로이드] - [안드로이드] DrawerLayout Navigaion 쉽게 만들어보기

 

[안드로이드] DrawerLayout Navigaion 쉽게 만들어보기

2021/01/15 - [안드로이드] - [안드로이드] TextToSpeech 텍스트(Text)를 음성으로 전환시켜주는 방법 2021/01/16 - [안드로이드] - [안드로이드]RecognizerIntent 음성을 텍스트(Text)로 전환시켜주는 방법 2021/..

aries574.tistory.com

맘에 드셨다면 공감부탁드려요

문의 댓글 환영합니다.

 

반응형

관련글 더보기

댓글 영역