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);
}
}
};
}
'안드로이드 웹앱 콘테츠 개발자 양성(국비지원) > Android 기능' 카테고리의 다른 글
Android Studio(기능) 장면 전환 Transition (0) | 2019.10.15 |
---|---|
Android Studio(기능) 첫페이지 인트로 효과 주기(로고,제목 애니메이션 효과) (0) | 2019.10.15 |
Android Studio(기능) Location / Map [Camera -API] (0) | 2019.10.14 |
Android Studio(기능) Location / Map [Camera -3 (동영상)] (0) | 2019.10.14 |
Android Studio(기능) Location / Map [Camera -2] (0) | 2019.10.14 |
댓글