매일 일정한 시간마다 알람이 울리는 안드로이드 앱을 만들었습니다. 

 

구현 내용은 다음과 같습니다.

 

  • 매일 설정해놓은 시간에 알람 소리가 울리고 노티피케이션을 띄웁니다. 

  • 노티피케이션을 선택시 앱이 실행됩니다. 

  • 지나간 시간에 대한 알림을 설정하면 다음 날에 울리도록 합니다.

  • 앱을 끄거나 스마트폰이 재부팅되어도 알람 시간을 기억했다가 울립니다.  

 


1. 동작 설명


2. 전체 소스 코드




1. 동작 설명 

전체 동작은 다음과 같습니다.

 

 

1. 처음 실행시키면 TimePicker와 버튼이 보입니다. 

TimePicker에서 원하는 시간을 설정합니다.






2. 버튼을 클릭하면 알람이 설정됩니다. 

이미 지나간 시간을 설정하면 알람이 울리는 날짜가 내일로 변경됩니다. 

 

설정 후 앱을 종료하거나 폰을 재부팅해도 동작합니다.

단 재부팅시에는 알람이 다시 동작하는데 좀 시간이 걸립니다.(부팅후 1~2분내에는 알림을 못받는듯합니다.)

폰이 부팅된 직후에는 동작하는 시스템 앱들이 많아서 빠른 우선순위를 얻지 못해서 인듯합니다.

 




3.  알람 시간이 되면 알람 소리와 함께  헤드업 알림(Heads Up Notification)이 보이게 됩니다. 

기종에 따라서는 헤드업 알림없이 상태바에 아이콘만 보일 수 있습니다. 

이 때 터치하면 앱으로 돌아갑니다. 

 

앱의 TimePicker에는 마지막에 설정했던 알람 시간을 보여줍니다.  

 




4. 상태바를 드래그해도 알림 정보가 보입니다. 

이때 터치해도 앱이 실행됩니다. 

 




2. 전체 소스 코드

1. AndroidManifest.xml

앱에서 필요한 권한과 리시버를 등록합니다.

 

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

    <uses-permission android:name="android.permission.WAKE_LOCK" />
    <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />

    <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/AppTheme">
        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

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

        <receiver android:name=".DeviceBootReceiver"
            android:enabled="false">
            <intent-filter>
                <action android:name="android.intent.action.BOOT_COMPLETED" />
            </intent-filter>
        </receiver>

        <receiver android:name=".AlarmReceiver" />

    </application>

</manifest>



2. activity_main.xml

 

시간을 설정할 때 사용하는 TimePicker와 알림을 시작하도록하는 버튼으로 구성되어 있습니다. 

 

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout
    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">

    <TimePicker
        android:id="@+id/timePicker"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        app:layout_constraintBottom_toTopOf="@id/button"
        app:layout_constraintVertical_chainStyle="packed"
        android:timePickerMode="spinner"/>

    <Button
        android:text="지정한 시간에 노티피케이션 발생시키기"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintTop_toBottomOf="@id/timePicker"
        app:layout_constraintBottom_toBottomOf="parent"
        android:layout_marginTop="20dp"
        android:id="@+id/button" />

</androidx.constraintlayout.widget.ConstraintLayout>



3. MainActivity.java

 

TimePicker를 이용하여 알람 시간을 설정하고  AlarmManager를 사용하여 해당 시간에 알림이 울리도록합니다.

 

package com.tistory.webnautes.notificationexample;

import androidx.appcompat.app.AppCompatActivity;

import android.app.AlarmManager;
import android.app.PendingIntent;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
import android.content.pm.PackageManager;
import android.os.Build;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.TimePicker;
import android.widget.Toast;

import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;
import java.util.Locale;

public class MainActivity extends AppCompatActivity {


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

        final TimePicker picker=(TimePicker)findViewById(R.id.timePicker);
        picker.setIs24HourView(true);


        // 앞서 설정한 값으로 보여주기
        // 없으면 디폴트 값은 현재시간
        SharedPreferences sharedPreferences = getSharedPreferences("daily alarm", MODE_PRIVATE);
        long millis = sharedPreferences.getLong("nextNotifyTime", Calendar.getInstance().getTimeInMillis());

        Calendar nextNotifyTime = new GregorianCalendar();
        nextNotifyTime.setTimeInMillis(millis);

        Date nextDate = nextNotifyTime.getTime();
        String date_text = new SimpleDateFormat("yyyy년 MM월 dd일 EE요일 a hh시 mm분 ", Locale.getDefault()).format(nextDate);
        Toast.makeText(getApplicationContext(),"[처음 실행시] 다음 알람은 " + date_text + "으로 알람이 설정되었습니다!", Toast.LENGTH_SHORT).show();


        // 이전 설정값으로 TimePicker 초기화
        Date currentTime = nextNotifyTime.getTime();
        SimpleDateFormat HourFormat = new SimpleDateFormat("kk", Locale.getDefault());
        SimpleDateFormat MinuteFormat = new SimpleDateFormat("mm", Locale.getDefault());

        int pre_hour = Integer.parseInt(HourFormat.format(currentTime));
        int pre_minute = Integer.parseInt(MinuteFormat.format(currentTime));


        if (Build.VERSION.SDK_INT >= 23 ){
            picker.setHour(pre_hour);
            picker.setMinute(pre_minute);
        }
        else{
            picker.setCurrentHour(pre_hour);
            picker.setCurrentMinute(pre_minute);
        }


        Button button = (Button) findViewById(R.id.button);
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View arg0) {

                int hour, hour_24, minute;
                String am_pm;
                if (Build.VERSION.SDK_INT >= 23 ){
                    hour_24 = picker.getHour();
                    minute = picker.getMinute();
                }
                else{
                    hour_24 = picker.getCurrentHour();
                    minute = picker.getCurrentMinute();
                }
                if(hour_24 > 12) {
                    am_pm = "PM";
                    hour = hour_24 - 12;
                }
                else
                {
                    hour = hour_24;
                    am_pm="AM";
                }

                // 현재 지정된 시간으로 알람 시간 설정
                Calendar calendar = Calendar.getInstance();
                calendar.setTimeInMillis(System.currentTimeMillis());
                calendar.set(Calendar.HOUR_OF_DAY, hour_24);
                calendar.set(Calendar.MINUTE, minute);
                calendar.set(Calendar.SECOND, 0);

                // 이미 지난 시간을 지정했다면 다음날 같은 시간으로 설정
                if (calendar.before(Calendar.getInstance())) {
                    calendar.add(Calendar.DATE, 1);
                }

                Date currentDateTime = calendar.getTime();
                String date_text = new SimpleDateFormat("yyyy년 MM월 dd일 EE요일 a hh시 mm분 ", Locale.getDefault()).format(currentDateTime);
                Toast.makeText(getApplicationContext(),date_text + "으로 알람이 설정되었습니다!", Toast.LENGTH_SHORT).show();

                //  Preference에 설정한 값 저장
                SharedPreferences.Editor editor = getSharedPreferences("daily alarm", MODE_PRIVATE).edit();
                editor.putLong("nextNotifyTime", (long)calendar.getTimeInMillis());
                editor.apply();


                diaryNotification(calendar);
            }

        });
    }


    void diaryNotification(Calendar calendar)
    {
//        PreferenceManager.setDefaultValues(this, R.xml.preferences, false);
//        SharedPreferences sharedPref = PreferenceManager.getDefaultSharedPreferences(this);
//        Boolean dailyNotify = sharedPref.getBoolean(SettingsActivity.KEY_PREF_DAILY_NOTIFICATION, true);
        Boolean dailyNotify = true; // 무조건 알람을 사용

        PackageManager pm = this.getPackageManager();
        ComponentName receiver = new ComponentName(this, DeviceBootReceiver.class);
        Intent alarmIntent = new Intent(this, AlarmReceiver.class);
        PendingIntent pendingIntent = PendingIntent.getBroadcast(this, 0, alarmIntent, 0);
        AlarmManager alarmManager = (AlarmManager) getSystemService(Context.ALARM_SERVICE);


        // 사용자가 매일 알람을 허용했다면
        if (dailyNotify) {


            if (alarmManager != null) {

                alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(),
                            AlarmManager.INTERVAL_DAY, pendingIntent);

                if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
                    alarmManager.setExactAndAllowWhileIdle(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), pendingIntent);
                }
            }

            // 부팅 후 실행되는 리시버 사용가능하게 설정
            pm.setComponentEnabledSetting(receiver,
                    PackageManager.COMPONENT_ENABLED_STATE_ENABLED,
                    PackageManager.DONT_KILL_APP);

        }
//        else { //Disable Daily Notifications
//            if (PendingIntent.getBroadcast(this, 0, alarmIntent, 0) != null && alarmManager != null) {
//                alarmManager.cancel(pendingIntent);
//                //Toast.makeText(this,"Notifications were disabled",Toast.LENGTH_SHORT).show();
//            }
//            pm.setComponentEnabledSetting(receiver,
//                    PackageManager.COMPONENT_ENABLED_STATE_DISABLED,
//                    PackageManager.DONT_KILL_APP);
//        }
    }

}

 

 

4. AlarmReceiver.java

 

알람 시간에 사용자에게 알림을 헤드업 알림(Heads Up Notification) 또는 상태바에 아이콘으로 보여주도록합니다. 

알림을 사용자가 터치시 앱이 실행되도록  합니다. 

 

package com.tistory.webnautes.notificationexample;

import android.app.NotificationChannel;
import android.app.NotificationManager;
import android.app.PendingIntent;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
import android.widget.Toast;

import androidx.core.app.NotificationCompat;

import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.Locale;


import static android.content.Context.MODE_PRIVATE;

public class AlarmReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {


        NotificationManager notificationManager = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);
        Intent notificationIntent = new Intent(context, MainActivity.class);

        notificationIntent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP
                | Intent.FLAG_ACTIVITY_SINGLE_TOP);

        PendingIntent pendingI = PendingIntent.getActivity(context, 0,
                notificationIntent, 0);


        NotificationCompat.Builder builder = new NotificationCompat.Builder(context, "default");


        //OREO API 26 이상에서는 채널 필요
        if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.O) {

            builder.setSmallIcon(R.drawable.ic_launcher_foreground); //mipmap 사용시 Oreo 이상에서 시스템 UI 에러남


            String channelName ="매일 알람 채널";
            String description = "매일 정해진 시간에 알람합니다.";
            int importance = NotificationManager.IMPORTANCE_HIGH; //소리와 알림메시지를 같이 보여줌

            NotificationChannel channel = new NotificationChannel("default", channelName, importance);
            channel.setDescription(description);

            if (notificationManager != null) {
                // 노티피케이션 채널을 시스템에 등록
                notificationManager.createNotificationChannel(channel);
            }
        }else builder.setSmallIcon(R.mipmap.ic_launcher); // Oreo 이하에서 mipmap 사용하지 않으면 Couldn't create icon: StatusBarIcon 에러남


        builder.setAutoCancel(true)
                .setDefaults(NotificationCompat.DEFAULT_ALL)
                .setWhen(System.currentTimeMillis())

                .setTicker("{Time to watch some cool stuff!}")
                .setContentTitle("상태바 드래그시 보이는 타이틀")
                .setContentText("상태바 드래그시 보이는 서브타이틀")
                .setContentInfo("INFO")
                .setContentIntent(pendingI);

        if (notificationManager != null) {

            // 노티피케이션 동작시킴
            notificationManager.notify(1234, builder.build());

            Calendar nextNotifyTime = Calendar.getInstance();

            // 내일 같은 시간으로 알람시간 결정
            nextNotifyTime.add(Calendar.DATE, 1);

            //  Preference에 설정한 값 저장
            SharedPreferences.Editor editor = context.getSharedPreferences("daily alarm", MODE_PRIVATE).edit();
            editor.putLong("nextNotifyTime", nextNotifyTime.getTimeInMillis());
            editor.apply();

            Date currentDateTime = nextNotifyTime.getTime();
            String date_text = new SimpleDateFormat("yyyy년 MM월 dd일 EE요일 a hh시 mm분 ", Locale.getDefault()).format(currentDateTime);
            Toast.makeText(context.getApplicationContext(),"다음 알람은 " + date_text + "으로 알람이 설정되었습니다!", Toast.LENGTH_SHORT).show();
        }
    }
}

 

5. DeviceBootReceiver

재부팅후에도  알림이 동작하도록합니다.

 

package com.tistory.webnautes.notificationexample;

import android.app.AlarmManager;
import android.app.PendingIntent;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
import android.widget.Toast;

import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;
import java.util.Locale;
import java.util.Objects;

import static android.content.Context.MODE_PRIVATE;

public class DeviceBootReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        if (Objects.equals(intent.getAction(), "android.intent.action.BOOT_COMPLETED")) {

            // on device boot complete, reset the alarm
            Intent alarmIntent = new Intent(context, AlarmReceiver.class);
            PendingIntent pendingIntent = PendingIntent.getBroadcast(context, 0, alarmIntent, 0);

            AlarmManager manager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
//

            SharedPreferences sharedPreferences = context.getSharedPreferences("daily alarm", MODE_PRIVATE);
            long millis = sharedPreferences.getLong("nextNotifyTime", Calendar.getInstance().getTimeInMillis());


            Calendar current_calendar = Calendar.getInstance();
            Calendar nextNotifyTime = new GregorianCalendar();
            nextNotifyTime.setTimeInMillis(sharedPreferences.getLong("nextNotifyTime", millis));

            if (current_calendar.after(nextNotifyTime)) {
                nextNotifyTime.add(Calendar.DATE, 1);
            }

            Date currentDateTime = nextNotifyTime.getTime();
            String date_text = new SimpleDateFormat("yyyy년 MM월 dd일 EE요일 a hh시 mm분 ", Locale.getDefault()).format(currentDateTime);
            Toast.makeText(context.getApplicationContext(),"[재부팅후] 다음 알람은 " + date_text + "으로 알람이 설정되었습니다!", Toast.LENGTH_SHORT).show();


            if (manager != null) {
                manager.setRepeating(AlarmManager.RTC_WAKEUP, nextNotifyTime.getTimeInMillis(),
                        AlarmManager.INTERVAL_DAY, pendingIntent);
            }
        }
    }
}



 

3. 참고

 

[1] Android TimePicker with Examples

https://www.tutlane.com/tutorial/android/android-timepicker-with-examples 



[2] How To give notifications on android on specific time in Android Oreo?

https://stackoverflow.com/a/51645875 



[3] Android Notification 예제 ( Oreo, androidx 적용 )

https://webnautes.tistory.com/665 



[4] Android Shared preferences example 

https://stackoverflow.com/a/23024962 



[5] Android SimpleDateFormat 예제 - 현재날짜 년, 월, 일, 요일 출력하기

https://webnautes.tistory.com/1307 





포스트 작성시에는 문제 없었지만 이후 문제가 생길 수 있습니다.
댓글로 알려주시면 빠른 시일내에 답변을 드리겠습니다.

여러분의 응원으로 좋은 컨텐츠가 만들어집니다.
지금 본 내용이 도움이 되었다면 유튜브 구독 부탁드립니다. 감사합니다 : )

유튜브 구독하기

  1. 2019.10.02 14:28

    비밀댓글입니다

    • Favicon of https://webnautes.tistory.com BlogIcon webnautes 2019.10.02 14:56 신고

      다음 코드 앞에 hour_24 와 minute 변수에 원하는 시간을 입력해주면 됩니다.
      예를들어 오후 5시 반이라면

      hour_24 = 17;
      minute = 30;



      Calendar calendar = Calendar.getInstance();
      calendar.setTimeInMillis(System.currentTimeMillis());
      calendar.set(Calendar.HOUR_OF_DAY, hour_24);
      calendar.set(Calendar.MINUTE, minute);
      calendar.set(Calendar.SECOND, 0);

  2. 질문 2019.10.07 20:28

    좋은 글 올려주셔서 감사합니다!

    제가 내부db를 조회해서 notification을 띄우려고 하는데
    AlarmReceiver 클래스에서
    if (notificationManager != null)
    뒤로 쿼리 조건문을 넣으면 될까요?

    • Favicon of https://webnautes.tistory.com BlogIcon webnautes 2019.10.07 20:36 신고

      사용자가 선택한 시간을 알람에 적용하는
      버튼 클릭시 실행되는 onClick 함수를 참고하여 작성하는 게 더 좋을 듯합니다.

    • 질문 2019.10.07 21:05

      지정한 시간에 자동으로 쿼리문이 돌아가게 하고 싶은데
      on click에서 하는건가요?


      Calendar calendar = Calendar.getInstance();
      calendar.setTimeInMillis(System.currentTimeMillis());
      calendar.set(Calendar.HOUR_OF_DAY, hour_24);
      calendar.set(Calendar.MINUTE, minute);
      calendar.set(Calendar.SECOND, 0);
      뒤에 적으면 될까요?

    • Favicon of https://webnautes.tistory.com BlogIcon webnautes 2019.10.07 21:33 신고

      제가 처음 질문을 잘못 이해했군요....

      지정한 시간에 자동으로 쿼리를 날리는 거라면 얘기하신대로 다음 코드 이후에 하면 됩니다.

      if (notificationManager != null) {

  3. 감사합니다 2019.10.24 23:26

    올려주신 자료를 보고 하나하나 공부 중 입니다. 감사합니다.

    Mainactivity 부터 하나하나 짚어 보고 있는데

    Calendar calendar = Calendar.getInstance();
    calendar.setTimeInMillis(System.currentTimeMillis());
    calendar.set(Calendar.HOUR_OF_DAY, hour_24);
    calendar.set(Calendar.MINUTE, minute);
    calendar.set(Calendar.SECOND, 0);

    이 부분이 해당 시간을 저장해 두는 위치이고


    nextNotifyTime.add(Calendar.DATE, 1);

    이 부분이 매일 같은 시간 울리도록 해주는 코드가 인듯 한데

    중간에 멈추고 싶다면 Calendar 내용물을 비우는 방법을 찾으면 되는건가요??

    • Favicon of https://webnautes.tistory.com BlogIcon webnautes 2019.10.24 23:46 신고

      알람을 비활성화하는 것은 MainActivity.java에 주석처리되어 있는 다음 부분입니다.


      // else { //Disable Daily Notifications
      // if (PendingIntent.getBroadcast(this, 0, alarmIntent, 0) != null && alarmManager != null) {
      // alarmManager.cancel(pendingIntent);
      // //Toast.makeText(this,"Notifications were disabled",Toast.LENGTH_SHORT).show();
      // }
      // pm.setComponentEnabledSetting(receiver,
      // PackageManager.COMPONENT_ENABLED_STATE_DISABLED,
      // PackageManager.DONT_KILL_APP);
      // }


  4. 공부 2019.10.25 11:46

    혹시 댓글로 달아주신 비활성화를 입력하지 않는 이상 알람이 누적되나요??

    두개 세개씩 알람을 띄우는건지

    단일 알람만 가능한지요?

    • Favicon of https://webnautes.tistory.com BlogIcon webnautes 2019.10.25 17:18 신고

      새로 알람을 설정하면 기존설정에 덮어쓰기합니다. 단일 알람만 가능하기 때문입니다.

    • Favicon of https://webnautes.tistory.com BlogIcon webnautes 2019.10.25 17:20 신고

      이론적으로는 아래 코드를 실행할때마다 알람을 띄울 수 있습니다.

      notificationManager.notify(1234, builder.build());

      하지만 현재 코드의 대부분이 하나의 알람을 위해 시간설정하는 것으로 되어있어 다수의 알람을 위해 동작하도록 하기엔 고칠부분이 많을듯합니다

  5. 문제가 뭘까요 2019.10.26 17:58

    첫번째 알림은 제대로 작동 하는데. 시간 조작을 해서 다음날 알림이 울리는지 확인해 봤더니

    두번째 알림 작동을 안하네요.

    5시로 알림을 맞춰놓고 그 다음날 5시가 되면 알림이 다시 울려야 하는데. 울리지 않고..

    5시에 알림이 울린 후 시간을 뒤로 돌려서 다시 5시로 맞춰도 울리지 않습니다.

    뭐가 문제일까요..?

    ( 알림이 일회성인듯 합니다 )

    • Favicon of https://webnautes.tistory.com BlogIcon webnautes 2019.10.26 20:34 신고

      1분후 울리도록 수정해서 잘 동작하나 확인해보세요. 현재 문제없이 코드 그대로 사용중이라서요.

    • 문제가 뭘까요 2019.10.26 20:49

      답변 감사합니다. 설정한 알람이 매일 정상 작동 한다는 말씀이신가요??

      현재 다음날 알람이 작동하지 않고 있는데..

      제가 어딘가 잘못 건드렸다는 소리겠네요...

    • Favicon of https://webnautes.tistory.com BlogIcon webnautes 2019.10.26 21:40 신고

      잘 사용중인 코드입니다

    • 힐도르프 2019.11.18 10:23

      단말기가 Doze 모드 또는 Sleep 모드로 진입되어 있을 시에 반복 알람이 실행되면 다시 등록되지 않는 경우가 있습니다.
      테스트를 많이 하다보니 오래전에 (Doze모드가 처음 나올 당시) 해당 증상을 발견했는데 아직 해당 증상이 여전합니다.

    • Favicon of https://webnautes.tistory.com BlogIcon webnautes 2019.11.18 19:45 신고

      댓글 감사합니다

  6. 공공 2019.11.04 01:36

    혹시 벨소리나 진동같은 기능을 추가하려면 어느 부분에 코드를 추가해야하는지 알 수 있을까요 ?.?

    • Favicon of https://webnautes.tistory.com BlogIcon webnautes 2019.11.04 09:27 신고

      NotificationChannel를 사용하여 조정하는 걸로 알고 있습니다. 관련 내용을 찾아보세요.

    • 공공 2019.11.04 23:32

      덕분에 한단계 더 나아갈 수 있었습니다!!
      좋은글 감사합니다~~!!

    • Favicon of https://webnautes.tistory.com BlogIcon webnautes 2019.11.05 00:28 신고

      감사합니다 : )

  7. 동쥐 2019.11.14 17:17

    매일 자정이지나면 푸시알림을 한번씩주고싶은데 어떤식으로 응용하면좋을까요 ㅠㅠ 넘어렵네요

    • Favicon of https://webnautes.tistory.com BlogIcon webnautes 2019.11.14 21:11 신고

      하려고 하는게 현재 포스트 코드와 똑같은게 아닌가요?

  8. 가나다라바 2020.01.30 20:47

    안녕하세요. 이 소스를 기반으로 DB를 통하여 정해진 날짜와 시간에 알람이 울릴 수 있도록 했고, 여기서 DB를 삭제하면, 알람도 지워지도록 구현해 보았습니다... 다만 NotificationManager를 통해 울리게 되는 알람 내용은 완전히 동일하다는 문제가 있어서, 여기서 알람이 울릴 때, 이에 해당하는 DB의 내용을 참조하여 서로 다른 내용의 알람이 울리게 하고 싶은데, 어떻게 구현해야 할 지 전혀 갈피가 잡히지가 않습니다...

    • 가나다라바 2020.01.30 20:53

      pendinintent의 requestcode는 db의 int형의 기본키를 보냈는데, AlarmRecerver.class에서 이를 식별할 수 있는 방법이 있을까요....??

    • Favicon of https://webnautes.tistory.com BlogIcon webnautes 2020.01.30 21:26 신고

      AlarmReceiver 클래스에서 노티피케이션을 생성하기전에 데이터베이스에 쿼리를 날려 값을 가져오면 해결 되지 않을까요?

  9. 하이 2020.04.01 00:53

    제가 알람어플 글만 다 찾아보면서 했는데 전부alarmmanager 를 사용하시더라구요
    근데 왜 저는 10분 안쪽으로는 실행이 되는데 왜 그 이상으로 30분뒤 1시간뒤에 맞추어놓으면 왜 될때도 있고 거의 대부분 안되는걸까요...
    어플이 몇분 지나면 기능을 못하는건지 아니면 시간을 주기적으로 비교하지 못하는건지...ㅠㅜㅠ

+ Recent posts