Android기능_Alram

소정·2023년 3월 3일
0

Android_with_Java

목록 보기
21/33

Alarm (알람)

  • 알람은 PendingIntent()로 밖에 못함
  • 알람이 울렸을 때 브로드캐스트와 서비스 가동 해보기

[1] 알람앱 이용하기

  • 인텐트 이용
  • 기본 앱인 알람앱을 실행함
  • 기본 이걸로 함

[2] 알람매니저

  • 내가 직접 제어 하는 것

1. 알람 매니저 이용한 10초 뒤 알람 울리기

2. 알람 매니저 이용한 특정 시간 알람


총 코드

main.java

package com.bsj0420.ex64alarm;

import androidx.appcompat.app.AppCompatActivity;

import android.app.AlarmManager;
import android.app.DatePickerDialog;
import android.app.PendingIntent;
import android.app.TimePickerDialog;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.provider.AlarmClock;
import android.widget.DatePicker;
import android.widget.TimePicker;

import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;

public class MainActivity extends AppCompatActivity {

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

        findViewById(R.id.btn_app).setOnClickListener(view -> clickBtnApp());
        findViewById(R.id.btn_mg).setOnClickListener(view -> clickBtnMg());
        findViewById(R.id.btn_mg_setTime).setOnClickListener(view -> clickBtnMgSetTime());
    }

    private void clickBtnMgSetTime() {
        //사용자가 원하는 날짜와 시간을 선택하여 알람 지정
        //날짜 선택 다이얼로그 보이기
        DatePickerDialog dialog = new DatePickerDialog(this);
        
        //날짜 고른 값 받아오기
        dialog.setOnDateSetListener(new DatePickerDialog.OnDateSetListener() {
            @Override
            public void onDateSet(DatePicker datePicker, int i, int i1, int i2) {
                // i - 년 / i1 - 월 / i2 - 일
                year = i;
                month = i1;
                day = i2;

                //이번엔 시간 선택기
                //현재시간을 기준 시간으로 설정
                Calendar calendar = Calendar.getInstance(); //싱글턴 패턴
                hour = calendar.get(Calendar.HOUR_OF_DAY);
                minute = calendar.get(Calendar.MINUTE);
                new TimePickerDialog(MainActivity.this,timeSetListener,hour,minute,true).show();
            }
        });

        dialog.show();
        
    }

    //
    int year, month, day;
    int hour, minute;
    
    //시간 설정에 반응하는 리스너 객체 생성
    TimePickerDialog.OnTimeSetListener timeSetListener = new TimePickerDialog.OnTimeSetListener() {
        @Override
        public void onTimeSet(TimePicker timePicker, int i, int i1) {
            //파라미터 i 시 i1은 분
            hour = i;
            minute = i1;

            //정해진 날짜로 칼랜다 객체 다시 생성
            Calendar calendar = Calendar.getInstance(); //현재시간
            calendar.set(year,month,day,hour,minute,6); //사용자한테 받은 값으려 바꿔치기

            //정한 시간으로 알람 설정
            AlarmManager manager = (AlarmManager)getSystemService(Context.ALARM_SERVICE);
            
            //알람 설정 시간에 실행 할 컴포넌트(액티비티, 브로드캐스트, 서비스) 지정
            Intent intent = new Intent(MainActivity.this , AlarmReceiver.class);
            PendingIntent pendingIntent = PendingIntent.getBroadcast(MainActivity.this,200,intent,PendingIntent.FLAG_IMMUTABLE);

            //알람 실행
            manager.setAndAllowWhileIdle(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(),pendingIntent);

        }
    };
    
    
    

    private void clickBtnMg() {
        //알람 매니저를 이용하여 직접 알람을 설정해보기
        //현재 시간에서 10초뒤
        AlarmManager alarmManager = (AlarmManager)getSystemService(Context.ALARM_SERVICE);
        
        //알람시간이 되었을 때 실행될 컴포넌트 지정
        Intent intent= new Intent(this, AlarmReceiver.class);
        PendingIntent pendingIntent= PendingIntent.getBroadcast(this, 100, intent, PendingIntent.FLAG_IMMUTABLE);
        alarmManager.setAndAllowWhileIdle(AlarmManager.RTC_WAKEUP, System.currentTimeMillis()+10000, pendingIntent);
        //설정값 무조건 이것만 됨 setExactAndAllowWhileIdle (AlarmManager.RTC_WAKEUP)
        //1970010100:00:00 부터 밀리세컨드 기준으로 세고 있음
        // System.currentTimeMillis() : 현재시간을 밀리세컨즈로 같고 있는 애
        
    }

    private void clickBtnApp() {
        //알람시계 시스템 앱을 통해 알람 설정 (퍼미션 필요)
        Intent intent = new Intent(AlarmClock.ACTION_SET_ALARM); //묵시적 인텐트로
        intent.putExtra(AlarmClock.EXTRA_HOUR, 14);
        intent.putExtra(AlarmClock.EXTRA_MINUTES,35);
        intent.putExtra(AlarmClock.EXTRA_MESSAGE,"Test Message");
        
        // 반복시간 설정할 땐 ArrayList로 설정해야한다
        ArrayList<Integer> list=new ArrayList<Integer>();
        list.add(Calendar.MONDAY);
        list.add(Calendar.WEDNESDAY);
        list.add(Calendar.FRIDAY);
        intent.putExtra(AlarmClock.EXTRA_DAYS, list); //배열 안에 반복 할 날짜
        intent.putExtra(AlarmClock.EXTRA_SKIP_UI,true); //설정화면 안보이게하는 것 그냥 자동 설정됨
        startActivity(intent);
    }
}


브로드캐스트.java

package com.bsj0420.ex64alarm;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.util.Log;
import android.widget.Toast;

public class AlarmReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        Toast.makeText(context, "알람 받음", Toast.LENGTH_SHORT).show();
        Log.i("EX64", "알람 받음");

        //보통은 이곳에서 새로운 액티비티를 실행함 -> 이것도 막힘
        //통상적으로 Notifiction을 띄운다

    }
}

매니패스트

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

    <!-- 알람시계 앱을 통해 알람 설정 하려면 필요한 퍼미션 (개발자 사이트 확인)-->
    <uses-permission android:name="com.android.alarm.permission.SET_ALARM"/>

    <!-- 안드로이드 12버전에서 새로 추가된 퍼미션 -->
    <uses-permission android:name="android.permission.SCHEDULE_EXACT_ALARM"/>

    <application
        android:allowBackup="true"
        android:dataExtractionRules="@xml/data_extraction_rules"
        android:fullBackupContent="@xml/backup_rules"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/Theme.Ex64Alarm"
        tools:targetApi="31">
        <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=".AlarmReceiver"/>
    </application>

</manifest>
profile
보조기억장치

0개의 댓글