2020.12.25 - [안드로이드] - [안드로이드]Notification 간단한 알림 띄우기
2020.12.28 - [안드로이드] - [안드로이드]Notification 알림창에 액션기능 추가하기
이번 시간에는 사용자가 정한 시간에 알람이 울리는 앱을 만들어 보려고 합니다.
1.TimePicker를 통해서 시계를 띄우고 알람 시간을 정한다.
2. AlarmManager를 통해 정해진 시간이 되면 알람으로 알려준다.
화면구성은 사용자가 선택한 시간을 보여줄 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>
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);
}
}
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()));
}
}
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());
}
}
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>
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("알람 취소");
}
}
2021.01.23 - [안드로이드] - [안드로이드] 안드로이드 스튜디오 기본 색상 코드에서 가져오는 방법
2021.01.19 - [안드로이드] - [안드로이드] DrawerLayout Navigaion 쉽게 만들어보기
맘에 드셨다면 공감부탁드려요문의 댓글 환영합니다. |
[안드로이드] 이미지 리스트로 보여주는 방법 Picasso Recyclerview (0) | 2021.07.11 |
---|---|
[안드로이드] 내가 선택한 색으로 배경색 변경하는 방법 (0) | 2021.06.30 |
[안드로이드]업비트 api(Java)를 사용해서 자산 리스트 조회 (0) | 2021.06.20 |
[안드로이드]공통문자(strings.xml) 자바에서 호출하기 (0) | 2021.06.04 |
[안드로이드]업비트 api 사용해서 호가정보 가져오기 (0) | 2021.06.01 |
댓글 영역