본문 바로가기
안드로이드 웹앱 콘테츠 개발자 양성(국비지원)/Android 기능

Android Studio(기능) Alarm

by 차누감 2019. 10. 15.

1) Handler

2) Timer

3) Thread

4) AlarmManager 3가지 방법이 있다

[Activity, Broadcast, Service] - Intent로 사용함.

 

우선 화면 구성을 해보자.


 

activity_main.xml 코드


<?xml version="1.0" encoding="utf-8"?>
<LinearLayout 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"
android:orientation="vertical"
android:padding="16dp"
tools:context=".MainActivity">

<Button
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="set Alarm (Delay 10 seconds)"
android:textAllCaps="false"
android:onClick="clickBtn"/>

<Button
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="set Alarm (After 10s ,repeat 20s)"
android:textAllCaps="false"
android:onClick="clickBtn2"/>

<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="cancel alarm"
android:textAllCaps="false"
android:onClick="clickBtn3"/>
<Button
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="set Alarm( Date )"
android:textAllCaps="false"
android:onClick="clickBtn4"/>
</LinearLayout>


 

첫번째는 액티비티를 만들어서 띄우는 작업이다.

새로운 알람 창 제목을 설정했다.

이제 반복 알람을 실행할 BroadcastReceiver를 만들자.

MainActivity.java


package com.lcw.ex73alarmmanagertest;

import androidx.appcompat.app.AppCompatActivity;

import android.app.AlarmManager;
import android.app.PendingIntent;
import android.content.Context;
import android.content.Intent;
import android.os.Build;
import android.os.Bundle;
import android.view.View;

public class MainActivity extends AppCompatActivity {

AlarmManager alarmManager;


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

//알람관리자 소환
alarmManager= (AlarmManager) getSystemService(Context.ALARM_SERVICE);
}

public void clickBtn(View view) {
//10초 후에 알람 설정.. (10초 후에 AlarmActivity를 실행!)

//먼저 알람에 설정한 PendingIntent생성
Intent intent= new Intent(this, AlarmActivity.class);
PendingIntent pendingIntent= PendingIntent.getActivity(this,10,intent,PendingIntent.FLAG_UPDATE_CURRENT);
//requestCode [10]는 내가 임의로 식별할 번호, flags 는 중복된거 오면 어떡할 건지 FLAG_UPDATE_CURRENT : 같은게 중복되면 현재껄로 바꾼다.[해당 클래스이름을 쓰고 .FLAG 여러개가 나온다.]

//알람 매니저에게 알람 설정
//Marshmallow 버전부터 Doz(낮잠)모드가 생김
if(Build.VERSION.SDK_INT>=Build.VERSION_CODES.M){
alarmManager.setExactAndAllowWhileIdle(AlarmManager.RTC_WAKEUP, System.currentTimeMillis()+10000,pendingIntent);

}else{
alarmManager.setExact(AlarmManager.RTC_WAKEUP,System.currentTimeMillis()+10000,pendingIntent);//AlarmManager.RTC ELAPSED는 동작안함.
}
}

public void clickBtn2(View view) {
//반복 알람 : 10초 후에 처음 알람, 20초마다 반복 알람

//20초마다 발동할 Broadcast Receiver
//PendingIntent로 생성
Intent intent= new Intent(this,AlarmReceiver.class);
PendingIntent pendingIntent= PendingIntent.getBroadcast(this,20,intent,PendingIntent.FLAG_UPDATE_CURRENT);

//애석하게KitKet이후 버전부터는 Repeat 기능이 없음.
//그래서 알람을 하려면 행운의 편지 기법을 도입할 겁니다.
//첫 알람 설정(10초 후에)
if(Build.VERSION.SDK_INT>=Build.VERSION_CODES.M){
alarmManager.setExactAndAllowWhileIdle(AlarmManager.RTC_WAKEUP,System.currentTimeMillis()+10000,pendingIntent);
}else{
alarmManager.setExact(AlarmManager.RTC_WAKEUP,System.currentTimeMillis()+10000,pendingIntent);
}


}

public void clickBtn3(View view) {
//반복 알람 종료

//알람매니저에 보류되어 있는
//PendingIntent cancel하면 됨
Intent intent=new Intent(this,AlarmReceiver.class);
PendingIntent pendingIntent= PendingIntent.getBroadcast(this,20, intent, PendingIntent.FLAG_UPDATE_CURRENT);

alarmManager.cancel(pendingIntent);
}

public void clickBtn4(View view) {
}
}


AlarmActivity.java


package com.lcw.ex73alarmmanagertest;

import androidx.appcompat.app.AppCompatActivity;

import android.os.Bundle;

public class AlarmActivity extends AppCompatActivity {

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

getSupportActionBar().setTitle("Alarm Activity");
}
}


AlarmReceiver.java


package com.lcw.ex73alarmmanagertest;

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

import java.util.Date;

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

Toast.makeText(context,new Date().toString(), Toast.LENGTH_SHORT).show();

//반복알람을 위해 알람이 울리면
//다시 새로운 알람을 설정

//알람관리자 소환
AlarmManager alarmManager= (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
Intent i= new Intent(context,AlarmReceiver.class);
PendingIntent pendingIntent=PendingIntent.getBroadcast(context,20,intent,PendingIntent.FLAG_UPDATE_CURRENT);

//알람 설정(20초 후)
if(Build.VERSION.SDK_INT>=Build.VERSION_CODES.M){
alarmManager.setExactAndAllowWhileIdle(AlarmManager.RTC_WAKEUP, System.currentTimeMillis()+20000,pendingIntent);
}else{
alarmManager.setExact(AlarmManager.RTC_WAKEUP,System.currentTimeMillis()+20000,pendingIntent);
}

}
}


이제 날짜를 지정해서 알람을 설정해보자.

<MainActivity.java 최종 코드>

MainActivity.java


package com.lcw.ex73alarmmanagertest;

import androidx.appcompat.app.AppCompatActivity;

import android.app.AlarmManager;
import android.app.DatePickerDialog;
import android.app.Dialog;
import android.app.PendingIntent;
import android.app.TimePickerDialog;
import android.content.Context;
import android.content.Intent;
import android.os.Build;
import android.os.Bundle;
import android.view.View;
import android.widget.DatePicker;
import android.widget.TimePicker;
import android.widget.Toast;

import java.time.Year;
import java.util.Calendar;
import java.util.GregorianCalendar;
import java.util.Locale;

public class MainActivity extends AppCompatActivity {

AlarmManager alarmManager;


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

//알람관리자 소환
alarmManager= (AlarmManager) getSystemService(Context.ALARM_SERVICE);
}

public void clickBtn(View view) {
//10초 후에 알람 설정.. (10초 후에 AlarmActivity를 실행!)

//먼저 알람에 설정한 PendingIntent생성
Intent intent= new Intent(this, AlarmActivity.class);
PendingIntent pendingIntent= PendingIntent.getActivity(this,10,intent,PendingIntent.FLAG_UPDATE_CURRENT);
//requestCode [10]는 내가 임의로 식별할 번호, flags 는 중복된거 오면 어떡할 건지 FLAG_UPDATE_CURRENT : 같은게 중복되면 현재껄로 바꾼다.[해당 클래스이름을 쓰고 .FLAG 여러개가 나온다.]

//알람 매니저에게 알람 설정
//Marshmallow 버전부터 Doz(낮잠)모드가 생김
if(Build.VERSION.SDK_INT>=Build.VERSION_CODES.M){
alarmManager.setExactAndAllowWhileIdle(AlarmManager.RTC_WAKEUP, System.currentTimeMillis()+10000,pendingIntent);

}else{
alarmManager.setExact(AlarmManager.RTC_WAKEUP,System.currentTimeMillis()+10000,pendingIntent);//AlarmManager.RTC ELAPSED는 동작안함.
}
}

public void clickBtn2(View view) {
//반복 알람 : 10초 후에 처음 알람, 20초마다 반복 알람

//20초마다 발동할 Broadcast Receiver
//PendingIntent로 생성
Intent intent= new Intent(this,AlarmReceiver.class);
PendingIntent pendingIntent= PendingIntent.getBroadcast(this,20,intent,PendingIntent.FLAG_UPDATE_CURRENT);

//애석하게KitKet이후 버전부터는 Repeat 기능이 없음.
//그래서 알람을 하려면 행운의 편지 기법을 도입할 겁니다.
//첫 알람 설정(10초 후에)
if(Build.VERSION.SDK_INT>=Build.VERSION_CODES.M){
alarmManager.setExactAndAllowWhileIdle(AlarmManager.RTC_WAKEUP,System.currentTimeMillis()+10000,pendingIntent);
}else{
alarmManager.setExact(AlarmManager.RTC_WAKEUP,System.currentTimeMillis()+10000,pendingIntent);
}


}

public void clickBtn3(View view) {
//반복 알람 종료

//알람매니저에 보류되어 있는
//PendingIntent cancel하면 됨
Intent intent=new Intent(this,AlarmReceiver.class);
PendingIntent pendingIntent= PendingIntent.getBroadcast(this,20, intent, PendingIntent.FLAG_UPDATE_CURRENT);

alarmManager.cancel(pendingIntent);
}

//멤버변수
int Year, Month, Day;
int Hour, Min;

public void clickBtn4(View view) {
//특정 날짜에 알람 설정하기

//날짜선택 다이얼로그 보이기
GregorianCalendar calendar=new GregorianCalendar(Locale.KOREA);
DatePickerDialog dialog= new DatePickerDialog(this,onDateSetListener,calendar.get(Calendar.YEAR),calendar.get(Calendar.MONTH),calendar.get(Calendar.DAY_OF_MONTH));
dialog.show();
}

//날짜선택 리스너
DatePickerDialog.OnDateSetListener onDateSetListener= new DatePickerDialog.OnDateSetListener() {
@Override
public void onDateSet(DatePicker datePicker, int year, int month, int day) {
//Toast.makeText(MainActivity.this, year+","+(month+1)+","+day+"", Toast.LENGTH_SHORT).show();

//선택한 날짜 저장
Year= year;
Month= month;
Day= day;

//시간 선택 다이얼로그 보이기
GregorianCalendar calendar= new GregorianCalendar(Locale.KOREA);
TimePickerDialog dialog= new TimePickerDialog(MainActivity.this,timeSetListener,calendar.get(Calendar.HOUR_OF_DAY),calendar.get(Calendar.MINUTE),true);
dialog.show();
}
};

//시간 선택 리스너
TimePickerDialog.OnTimeSetListener timeSetListener= new TimePickerDialog.OnTimeSetListener() {
@Override
public void onTimeSet(TimePicker timePicker, int hour, int minute) {
//Toast.makeText(MainActivity.this, hour+":"+minute, Toast.LENGTH_SHORT).show();
Hour=hour;
Min=minute;

//선택한 날짜와 시간으로 알람 설정
GregorianCalendar calendar= new GregorianCalendar(Year, Month, Day,Hour,Min);

//알람시간에 AlarmActivity 실행되도록.
Intent intent= new Intent(MainActivity.this, AlarmActivity.class);
PendingIntent pendingIntent= PendingIntent.getActivity(MainActivity.this,30,intent,PendingIntent.FLAG_UPDATE_CURRENT);
if(Build.VERSION.SDK_INT>=Build.VERSION_CODES.M){
alarmManager.setExactAndAllowWhileIdle(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(),pendingIntent);
}else{
alarmManager.setExact(AlarmManager.RTC_WAKEUP,calendar.getTimeInMillis(),pendingIntent);
}
}
};
}


댓글