Skip to main content

Penggunaan Service di Alarm Manager

Penggunaan Service di Alarm Manager 

Adakalanya kita membutuhkan perlu suatu mekanisme untuk mengulang sebuah proses di waktu tertentu. Misalnya, kita ingin memiliki fungsi pengingat (reminder) pada aplikasi event, jadwal tayang film di bioskop, atau aplikasi alarm untuk mengingatkan kita untuk bangun di pagi hari. Disinilah alarm manager berperan penting.

Alarm manager akan memberikan kemudahan bagi aplikasi untuk melakukan operasi berbasis waktu diluar daur hidup aplikasi itu sendiri.  
Contohnya seperti yang baru saja disebutkan diatas. Umumnya alarm memiliki beberapa karakteristik, antara lain :
1. Dapat menjalankan obyek intent berdasarkan waktu dan interval yang ditentukan. 
2. Bisa bekerja dengan baik dengan broadcast receiver untuk menjalankan komponen lain seperti service untuk melakukan operasi tertentu. 
3. Alarm berjalan diluar daur hidup aplikasi induknya sehingga kita bisa merancang fungsi alarm untuk melakukan sebuah aksi ketika aplikasi sedang tidak dijalankan bahkan ketika peranti dalam keadaan idle atau sleep. 
4. Esensi utama dari alarm manager adalah untuk meminimalkan penggunaan resource dan menghindari penggunaan timer dan background service yang berkepanjangan untuk melakukan operasi atau aksi yang dibutuhkan.

Penggunaan dan perancangan alarm manager yang tepat akan membuat aplikasi kita menjadi lebih baik, serta tentunya memberikan pengalaman yang juga berkesan. Namun sebaliknya desain yang buruk akan menjadi bumerang bagi aplikasi kita. Akibat dari rancangan yang tidak sesuai akan menguras baterai di peranti kita.

Penggunaan alarm manager yang baik adalah dengan menerapkan cara berikut ini : 
1. Lakukan hanya untuk proses di lokal 
2. Jaga frekuensi alarm yang dijalankan dengan interval yang tidak pendek 
3. Jika tidak terlalu penting, hindari penggunaan tipe alarm yang dapat membangunkan peranti seperti RTC_WAKEUP 
4. Jika alarm manager digunakan untuk menjadwalkan scheduling task yang terhubung ke jaringan dan melakukan request ke server, misalnya unduh data terbaru atau sinkronisasi data, maka hindari penggunaan setRepeating() dan gunakan setInExactRepeating() dengan penggunaan tipe alarm berbasis ELAPSED_REALTIME. Pendekatan tersebut merupakan strategi untuk mengelompokkan proses alarm dari aplikasi yang berbeda dengan dijalankan secara bersamaan agar lebih menghemat daya baterai.

Catatan : Di atas API 19 KitKat semua pemanggilan repeating alarm adalah menggunakan in exact repeating

Kali ini saya akan membuat sebuah proyek sederhana dengan skenario seperti berikut. 
1. Aplikasi akan memiliki kemampuan untuk melakukan one-time-execution alarm dan alarm yang berulang berdasarkan waktu yang ditentukan. 
2. Aplikasi akan menyimpan beberapa nilai untuk kedua tipe alarm tersebut. 
3. Aplikasi akan menampilkan notifikasi dengan suara dan getar ketika alarm dijalankan. 

Buat Project baru diAndroid Studio dengan kriteria sebagai berikut : 
    o Nama Project : My Alarm Manager
    o Target & Minimum Target SDK: Phone, Api level 22: Android 5.1 (Lollipop)
    o Tipe Activity : Empty Activity


2. Pada activity_main.xml sesuaikan kodenya menjadi seperti berikut. 
<?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:paddingTop="@dimen/activity_vertical_margin"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:orientation="vertical"
tools:context="com.touvan.myalarmmanager.MainActivity">

<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/on_time_alarm"
android:layout_marginBottom="@dimen/activity_vertical_margin"
android:textSize="16sp"
android:textStyle="bold"/>

<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal">

<Button
android:text="..."
android:layout_width="50dp"
android:layout_height="wrap_content"
android:id="@+id/btn_one_time_alarm_date"/>

<TextView
android:id="@+id/tv_one_time_alarm_date"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Tanggal Alarm"
android:layout_marginBottom="@dimen/activity_vertical_margin"/>

</LinearLayout>

<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal">

<Button
android:text="..."
android:layout_width="50dp"
android:layout_height="wrap_content"
android:id="@+id/btn_one_time_alarm_time"/>

<TextView
android:id="@+id/tv_one_time_alarm_time"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Waktu Alarm"
android:layout_marginBottom="@dimen/activity_vertical_margin"/>

</LinearLayout>

<EditText
android:id="@+id/edt_one_time_alarm_message"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="Pesan Alarm"
android:layout_marginBottom="@dimen/activity_vertical_margin"/>

<Button
android:id="@+id/btn_set_one_time_alarm"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Set One Time Alarm"
android:layout_marginBottom="@dimen/activity_vertical_margin"/>

<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Repeating Alarm"
android:layout_marginBottom="@dimen/activity_vertical_margin"
android:textSize="16sp"
android:textStyle="bold"/>

<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal">

<Button
android:text="..."
android:layout_width="50dp"
android:layout_height="wrap_content"
android:id="@+id/btn_repeating_time_alarm_time"/>

<TextView
android:id="@+id/tv_repeating_alarm_time"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/waktu_alarm"
android:layout_marginBottom="@dimen/activity_vertical_margin"/>

</LinearLayout>

<EditText
android:id="@+id/edt_repeating_alarm_message"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="Pesan Alarm"
android:layout_marginBottom="@dimen/activity_vertical_margin"/>

<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal">

<Button
android:id="@+id/btn_repeating_time_alarm"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Set Repeating Alarm"
android:layout_weight="0.5"/>

<Button
android:id="@+id/btn_cancel_repeating_alarm"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Batalkan Alarm"
android:layout_weight="0.5"/>

</LinearLayout>

</LinearLayout>
Sehingga tampilan aplikasi dari activity_main.xml ketika dijalankan seperti berikut :


3. Setelah itu kita akan membuat sebuah mekanisme penyimpanan sederhana dengan menggunakan SharedPreference. Untuk itu, mari kita membuat sebuah kelas java baru dengan nama AlarmPreference.  Caranya, klik kanan pada package project yang ada saat ini → new → Java Class. Ketika sudah selesai, lengkapi kodenya menjadi seperti berikut.
package com.touvan.myalarmmanager;

import android.content.Context;
import android.content.SharedPreferences;

public class AlarmPreference {
private final String PREF_NAME = "AlarmPreference";
private final String KEY_ONE_TIME_DATE = "oneTimDate";
private final String KEY_ONE_TIME_TIME = "oneTimeTime";
private final String KEY_ONE_TIME_MESSAGE = "oneTimeMessage";
private final String KEY_REPEATING_TIME = "repeatingTime";
private final String KEY_REPEATING_MESSAGE = "repeatingMessage";
private SharedPreferences mSharedPreferences;
private SharedPreferences.Editor editor;

public AlarmPreference(Context context) {
mSharedPreferences = context.getSharedPreferences(PREF_NAME, Context.MODE_PRIVATE);
editor = mSharedPreferences.edit();
}

public void setOneTimeDate(String date) {
editor.putString(KEY_ONE_TIME_DATE, date);
editor.commit();
}

public String getOneTimeDate() {
return mSharedPreferences.getString(KEY_ONE_TIME_DATE, null);
}

public void setOneTimeTime(String time) {
editor.putString(KEY_ONE_TIME_TIME, time);
editor.commit();
}

public String getOneTimeTime() {
return mSharedPreferences.getString(KEY_ONE_TIME_TIME, null);
}

public void setOneTimeMessage(String message) {
editor.putString(KEY_ONE_TIME_MESSAGE, message);
editor.commit();
}

public String getOneTimeMessage() {
return mSharedPreferences.getString(KEY_ONE_TIME_MESSAGE, null);
}

public void setRepeatingTime(String time) {
editor.putString(KEY_REPEATING_TIME, time);
editor.commit();
}

public String getRepeatingTime() {
return mSharedPreferences.getString(KEY_REPEATING_TIME, null);
}

public void getRepeatingMessage(String message) {
editor.putString(KEY_REPEATING_MESSAGE, message);
editor.commit();
}

public String getRepeatingMessage() {
return mSharedPreferences.getString(KEY_REPEATING_MESSAGE, null);
}

public void clear() {
editor.clear();
editor.commit();
}
}
4. Setelah itu, buat kelas BroadcastReceiver bernama AlarmReceiver dan lengkapi kodenya seperti berikut.
package com.touvan.myalarmmanager;

import android.app.AlarmManager;
import android.app.Notification;
import android.app.NotificationManager;
import android.app.PendingIntent;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.media.RingtoneManager;
import android.net.Uri;
import android.widget.Toast;

import androidx.core.app.NotificationCompat;
import androidx.core.content.ContextCompat;

import java.util.Calendar;

public class AlarmReceiver extends BroadcastReceiver {
public static final String TYPE_ONE_TIME = "OneTimeAlarm";
public static final String TYPE_REPEATING = "RepeatingAlarm";
public static final String EXTRA_MESSAGE = "message";
public static final String EXTRA_TYPE = "type";
private final int NOTIF_ID_ONETIME = 100;
private final int NOTIF_ID_REPEATING = 101;

public AlarmReceiver() {
}
@Override
public void onReceive(Context context, Intent intent) {
String type = intent.getStringExtra(EXTRA_TYPE);
String message = intent.getStringExtra(EXTRA_MESSAGE);
String title = type.equalsIgnoreCase(TYPE_ONE_TIME) ? "One Time Alarm" : "Repeating Alarm";
int notifId = type.equalsIgnoreCase(TYPE_ONE_TIME) ? NOTIF_ID_ONETIME : NOTIF_ID_REPEATING;
showAlarmNotification(context, title, message, notifId);
}
private void showAlarmNotification(Context context, String title, String message, int notifId) {
NotificationManager notificationManagerCompat = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);
Uri alarmSound = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);
NotificationCompat.Builder builder = new NotificationCompat.Builder(context)
.setContentTitle(title)
.setContentText(message)
.setColor(ContextCompat.getColor(context, android.R.color.transparent))
.setVibrate(new long[]{1000, 1000, 1000, 1000, 1000})
.setSound(alarmSound);
notificationManagerCompat.notify(notifId, builder.build());
}
public void setOneTimeAlarm(Context context, String type, String date, String time, String message) {
AlarmManager alarmManager = (AlarmManager)context.getSystemService(Context.ALARM_SERVICE);
Intent intent = new Intent(context, AlarmReceiver.class);
intent.putExtra(EXTRA_MESSAGE, message);
intent.putExtra(EXTRA_TYPE, type);
String dateArray[] = date.split("-");
String timeArray[] = time.split(":");
Calendar calendar = Calendar.getInstance();
calendar.set(Calendar.YEAR, Integer.parseInt(dateArray[0]));
calendar.set(Calendar.MONTH, Integer.parseInt(dateArray[1])-1);
calendar.set(Calendar.DAY_OF_MONTH, Integer.parseInt(dateArray[2]));
calendar.set(Calendar.HOUR_OF_DAY, Integer.parseInt(timeArray[0]));
calendar.set(Calendar.MINUTE, Integer.parseInt(timeArray[1]));
calendar.set(Calendar.SECOND, 0);
int requestCode = NOTIF_ID_ONETIME;
PendingIntent pendingIntent = PendingIntent.getBroadcast(context, requestCode, intent, 0);
alarmManager.set(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), pendingIntent);
Toast.makeText(context, "One time alarm set up", Toast.LENGTH_SHORT).show();
}
public void cancelAlarm(Context context, String type) {
AlarmManager alarmManager = (AlarmManager)context.getSystemService(Context.ALARM_SERVICE);
Intent intent = new Intent(context, AlarmReceiver.class);
int requestCode = type.equalsIgnoreCase(TYPE_ONE_TIME) ? NOTIF_ID_ONETIME : NOTIF_ID_REPEATING;
PendingIntent pendingIntent = PendingIntent.getBroadcast(context, requestCode, intent, 0);
alarmManager.cancel(pendingIntent);
}
}

5. Setelah kita membuat sebuah AlarmReceiver dan menyesuaikan kode pada activity_main.xml, sekarang saatnya kita melengkapi MainActivity kodenya sehingga menjadi seperti ini : 
package com.touvan.myalarmmanager;

import androidx.appcompat.app.AppCompatActivity;

import android.app.DatePickerDialog;
import android.app.TimePickerDialog;
import android.os.Bundle;
import android.text.TextUtils;
import android.view.View;
import android.widget.Button;
import android.widget.DatePicker;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.TimePicker;

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

public class MainActivity extends AppCompatActivity implements View.OnClickListener{
private TextView tvOnTimeDate, tvOneTimeTime;
private TextView tvRepeatingTime;
private EditText edtOneTimeMessage, edtRepeatingMessage;
private Button btnOneTimeDate, btnOneTimeTime, btnOneTime, btnRepeatingTime, btnRepeating, btnCancelRepeatingAlarm;

private Calendar calOneTimeDate, calOneTimeTime, calRepeatTimeTime;

private AlarmReceiver alarmReceiver;
private AlarmPreference alarmPreference;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
tvOnTimeDate = (TextView) findViewById(R.id.tv_one_time_alarm_date);
tvOneTimeTime = (TextView) findViewById(R.id.tv_one_time_alarm_time);
edtOneTimeMessage = (EditText) findViewById(R.id.edt_one_time_alarm_message);
btnOneTimeDate = (Button) findViewById(R.id.btn_one_time_alarm_date);
btnOneTimeTime = (Button) findViewById(R.id.btn_one_time_alarm_time);
btnOneTime = (Button) findViewById(R.id.btn_set_one_time_alarm);
tvRepeatingTime = (TextView) findViewById(R.id.tv_repeating_alarm_time);
edtRepeatingMessage = (EditText) findViewById(R.id.edt_repeating_alarm_message);
btnRepeatingTime = (Button) findViewById(R.id.btn_repeating_time_alarm_time);
btnRepeating = (Button) findViewById(R.id.btn_repeating_time_alarm);
btnCancelRepeatingAlarm = (Button) findViewById(R.id.btn_cancel_repeating_alarm);

btnOneTimeDate.setOnClickListener(this);
btnOneTimeTime.setOnClickListener(this);
btnOneTime.setOnClickListener(this);
btnRepeatingTime.setOnClickListener(this);
btnRepeating.setOnClickListener(this);
btnCancelRepeatingAlarm.setOnClickListener(this);

calOneTimeDate = Calendar.getInstance();
calOneTimeTime = Calendar.getInstance();
calRepeatTimeTime = Calendar.getInstance();

alarmPreference = new AlarmPreference(this);
alarmReceiver = new AlarmReceiver();

if (!TextUtils.isEmpty(alarmPreference.getOneTimeDate())){
setOneTimeText();
}
}

@Override
public void onClick(View v) {
if(v.getId()== R.id.btn_one_time_alarm_date){
final Calendar currentDate = Calendar.getInstance();
new DatePickerDialog(this,new DatePickerDialog.OnDateSetListener() {

@Override
public void onDateSet(DatePicker view, int year, int monthOfYear, int dayOfMonth) {
calOneTimeDate.set(year, monthOfYear, dayOfMonth);
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-mm-dd");
tvOnTimeDate.setText(dateFormat.format(calOneTimeDate.getTime()));
}
}, currentDate.get(Calendar.YEAR),currentDate.get(Calendar.MONTH),currentDate.get(Calendar.DATE)).show();
}
else if (v.getId() == R.id.btn_one_time_alarm_time){
final Calendar currentDate=Calendar.getInstance();
new TimePickerDialog(this, new TimePickerDialog.OnTimeSetListener() {

@Override
public void onTimeSet(TimePicker view, int hourOfDay, int minute) {
calOneTimeTime.set(Calendar.HOUR_OF_DAY,hourOfDay);
calOneTimeTime.set(Calendar.MINUTE,minute);
SimpleDateFormat dateFormat = new SimpleDateFormat("HH:mm");
tvOneTimeTime.setText(dateFormat.format(calOneTimeTime.getTime()));
}
}, currentDate.get(Calendar.HOUR_OF_DAY),currentDate.get(Calendar.MINUTE),true).show();
}
else if (v.getId() == R.id.btn_set_one_time_alarm){
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
String oneTimeDate = dateFormat.format(calOneTimeDate.getTime());
SimpleDateFormat timeFormat = new SimpleDateFormat("HH:mm");
String oneTimeTime=timeFormat.format(calOneTimeTime.getTime());
String oneTimeMessage=edtOneTimeMessage.getText().toString();

alarmPreference.setOneTimeDate(oneTimeDate);
alarmPreference.setOneTimeMessage(oneTimeMessage);
alarmPreference.setOneTimeTime(oneTimeTime);

alarmReceiver.setOneTimeAlarm(this,AlarmReceiver.TYPE_ONE_TIME,
alarmPreference.getOneTimeDate(),
alarmPreference.getOneTimeTime(),
alarmPreference.getOneTimeMessage());
}
}
private void setOneTimeText(){
tvOneTimeTime.setText(alarmPreference.getOneTimeTime());
tvOnTimeDate.setText(alarmPreference.getOneTimeDate());
edtOneTimeMessage.setText(alarmPreference.getOneTimeMessage());
}
}
6. Jangan lupa untuk menambahkan permission pada AndroidManifest.xml beberapa baris berikut.
    <uses-permission android:name="android.permission.VIBRATE" />
<uses-permission android:name="android.permission.WAKE_LOCK" />
7. Jika sudah selesai, silakan jalankan aplikasi Anda. Dengan menekan tombol yang ada pada sebelah TextView tanggal dan waktu, Anda dapat mengganti tanggal dan waktu yang diinginkan. Isikan juga pesan alarm yang diinginkan. Setelah tanggal, waktu dan pesan telah Anda isi, lanjutkan dengan klik tombol SET ONE TIME ALARM dan silakan tunggu sampai waktu yang ditentukan, sehingga alarm akan dijalankan. Jika sukses, maka waktu yang kita set di awal akan tampil On time alarm set up pada layar.


Anda sudah bisa mengimplementasikan one-time-alarm untuk tanggal dan jam yang telah ditentukan. Fungsi ini bisa berguna untuk beragam fitur lain. Misalnya jika Anda membuat aplikasi tentang event, pasti fungsi ini akan sangat berguna sebagai mekanisme pengingat. 

Kita lanjutkan ngoding untuk latihan alarm manager. Kali ini kita akan membuat latihan sederhana tentang repeating-alarm

1. Pada AlarmReceiver silakan buat metode setRepeatingAlarm() pada baris berikut
public void setRepeatingAlarm(Context context, String type, String time, String message) {
AlarmManager alarmManager = (AlarmManager)context.getSystemService(Context.ALARM_SERVICE);
Intent intent = new Intent(context, AlarmReceiver.class);
intent.putExtra(EXTRA_MESSAGE, message);
intent.putExtra(EXTRA_TYPE, type);
String timeArray[] = time.split(":");
Calendar calendar = Calendar.getInstance();
calendar.set(Calendar.HOUR_OF_DAY, Integer.parseInt(timeArray[0]));
calendar.set(Calendar.MINUTE, Integer.parseInt(timeArray[1]));
calendar.set(Calendar.SECOND,0);
int requestCode = NOTIF_ID_REPEATING;
PendingIntent pendingIntent = PendingIntent.getBroadcast(context,requestCode, intent,0);
alarmManager.setInexactRepeating(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), AlarmManager.INTERVAL_DAY, pendingIntent);
Toast.makeText(context, "Repeating alarm set up", Toast.LENGTH_SHORT).show();
}
2. Sehingga kode AlarmManager kita saat ini menjadi seperti ini. 
package com.touvan.myalarmmanager;

import android.app.AlarmManager;
import android.app.Notification;
import android.app.NotificationManager;
import android.app.PendingIntent;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.media.RingtoneManager;
import android.net.Uri;
import android.widget.Toast;

import androidx.core.app.NotificationCompat;
import androidx.core.content.ContextCompat;

import java.util.Calendar;

public class AlarmReceiver extends BroadcastReceiver {
public static final String TYPE_ONE_TIME = "OneTimeAlarm";
public static final String TYPE_REPEATING = "RepeatingAlarm";
public static final String EXTRA_MESSAGE = "message";
public static final String EXTRA_TYPE = "type";
private final int NOTIF_ID_ONETIME = 100;
private final int NOTIF_ID_REPEATING = 101;

public AlarmReceiver() {
}
@Override
public void onReceive(Context context, Intent intent) {
String type = intent.getStringExtra(EXTRA_TYPE);
String message = intent.getStringExtra(EXTRA_MESSAGE);
String title = type.equalsIgnoreCase(TYPE_ONE_TIME) ? "One Time Alarm" : "Repeating Alarm";
int notifId = type.equalsIgnoreCase(TYPE_ONE_TIME) ? NOTIF_ID_ONETIME : NOTIF_ID_REPEATING;
showAlarmNotification(context, title, message, notifId);
}
private void showAlarmNotification(Context context, String title, String message, int notifId) {
NotificationManager notificationManagerCompat = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);
Uri alarmSound = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);
NotificationCompat.Builder builder = new NotificationCompat.Builder(context)
.setContentTitle(title)
.setContentText(message)
.setColor(ContextCompat.getColor(context, android.R.color.transparent))
.setVibrate(new long[]{1000, 1000, 1000, 1000, 1000})
.setSound(alarmSound);
notificationManagerCompat.notify(notifId, builder.build());
}
public void setOneTimeAlarm(Context context, String type, String date, String time, String message) {
AlarmManager alarmManager = (AlarmManager)context.getSystemService(Context.ALARM_SERVICE);
Intent intent = new Intent(context, AlarmReceiver.class);
intent.putExtra(EXTRA_MESSAGE, message);
intent.putExtra(EXTRA_TYPE, type);
String dateArray[] = date.split("-");
String timeArray[] = time.split(":");
Calendar calendar = Calendar.getInstance();
calendar.set(Calendar.YEAR, Integer.parseInt(dateArray[0]));
calendar.set(Calendar.MONTH, Integer.parseInt(dateArray[1])-1);
calendar.set(Calendar.DAY_OF_MONTH, Integer.parseInt(dateArray[2]));
calendar.set(Calendar.HOUR_OF_DAY, Integer.parseInt(timeArray[0]));
calendar.set(Calendar.MINUTE, Integer.parseInt(timeArray[1]));
calendar.set(Calendar.SECOND, 0);
int requestCode = NOTIF_ID_ONETIME;
PendingIntent pendingIntent = PendingIntent.getBroadcast(context, requestCode, intent, 0);
alarmManager.set(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), pendingIntent);
Toast.makeText(context, "One time alarm set up", Toast.LENGTH_SHORT).show();
}
public void setRepeatingAlarm(Context context, String type, String time, String message) {
AlarmManager alarmManager = (AlarmManager)context.getSystemService(Context.ALARM_SERVICE);
Intent intent = new Intent(context, AlarmReceiver.class);
intent.putExtra(EXTRA_MESSAGE, message);
intent.putExtra(EXTRA_TYPE, type);
String timeArray[] = time.split(":");
Calendar calendar = Calendar.getInstance();
calendar.set(Calendar.HOUR_OF_DAY, Integer.parseInt(timeArray[0]));
calendar.set(Calendar.MINUTE, Integer.parseInt(timeArray[1]));
calendar.set(Calendar.SECOND,0);
int requestCode = NOTIF_ID_REPEATING;
PendingIntent pendingIntent = PendingIntent.getBroadcast(context,requestCode, intent,0);
alarmManager.setInexactRepeating(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), AlarmManager.INTERVAL_DAY, pendingIntent);
Toast.makeText(context, "Repeating alarm set up", Toast.LENGTH_SHORT).show();
}
public void cancelAlarm(Context context, String type) {
AlarmManager alarmManager = (AlarmManager)context.getSystemService(Context.ALARM_SERVICE);
Intent intent = new Intent(context, AlarmReceiver.class);
int requestCode = type.equalsIgnoreCase(TYPE_ONE_TIME) ? NOTIF_ID_ONETIME : NOTIF_ID_REPEATING;
PendingIntent pendingIntent = PendingIntent.getBroadcast(context, requestCode, intent, 0);
alarmManager.cancel(pendingIntent);
}
}

3. Selanjutnya, pada method onClick() di MainActivity silakan tambahkan baris berikut : 
else if (v.getId() == R.id.btn_repeating_time_alarm_time){
final Calendar currentDate = Calendar.getInstance();
new TimePickerDialog(this, new TimePickerDialog.OnTimeSetListener() {
@Override
public void onTimeSet(TimePicker view, int hourOfDay, int minute) {
calRepeatTimeTime.set(Calendar.HOUR_OF_DAY, hourOfDay);
calRepeatTimeTime.set(Calendar.MINUTE, minute);
SimpleDateFormat dateFormat = new SimpleDateFormat("HH:mm");
tvRepeatingTime.setText(dateFormat.format(calRepeatTimeTime.getTime()));
}
}, currentDate.get(Calendar.HOUR_OF_DAY),currentDate.get(Calendar.MINUTE),true).show();
}
else if (v.getId() == R.id.btn_repeating_time_alarm){
SimpleDateFormat timeFormat = new SimpleDateFormat("HH:mm");
String repeatTimeTime = timeFormat.format(calRepeatTimeTime.getTime());
String repeatTimeMessage = edtRepeatingMessage.getText().toString();

alarmPreference.setRepeatingTime(repeatTimeTime);
alarmPreference.setOneTimeMessage(repeatTimeMessage);

alarmReceiver.setRepeatingAlarm(this, AlarmReceiver.TYPE_REPEATING,
alarmPreference.getRepeatingTime(),
alarmPreference.getRepeatingMessage());
}
4. Sehingga secara keseluruhan kode method onClick() kita menjadi seperti ini : 
package com.touvan.myalarmmanager;

import androidx.appcompat.app.AppCompatActivity;

import android.app.DatePickerDialog;
import android.app.TimePickerDialog;
import android.os.Bundle;
import android.text.TextUtils;
import android.view.View;
import android.widget.Button;
import android.widget.DatePicker;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.TimePicker;

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

public class MainActivity extends AppCompatActivity implements View.OnClickListener{
private TextView tvOnTimeDate, tvOneTimeTime;
private TextView tvRepeatingTime;
private EditText edtOneTimeMessage, edtRepeatingMessage;
private Button btnOneTimeDate, btnOneTimeTime, btnOneTime, btnRepeatingTime, btnRepeating, btnCancelRepeatingAlarm;

private Calendar calOneTimeDate, calOneTimeTime, calRepeatTimeTime;

private AlarmReceiver alarmReceiver;
private AlarmPreference alarmPreference;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
tvOnTimeDate = (TextView) findViewById(R.id.tv_one_time_alarm_date);
tvOneTimeTime = (TextView) findViewById(R.id.tv_one_time_alarm_time);
edtOneTimeMessage = (EditText) findViewById(R.id.edt_one_time_alarm_message);
btnOneTimeDate = (Button) findViewById(R.id.btn_one_time_alarm_date);
btnOneTimeTime = (Button) findViewById(R.id.btn_one_time_alarm_time);
btnOneTime = (Button) findViewById(R.id.btn_set_one_time_alarm);
tvRepeatingTime = (TextView) findViewById(R.id.tv_repeating_alarm_time);
edtRepeatingMessage = (EditText) findViewById(R.id.edt_repeating_alarm_message);
btnRepeatingTime = (Button) findViewById(R.id.btn_repeating_time_alarm_time);
btnRepeating = (Button) findViewById(R.id.btn_repeating_time_alarm);
btnCancelRepeatingAlarm = (Button) findViewById(R.id.btn_cancel_repeating_alarm);

btnOneTimeDate.setOnClickListener(this);
btnOneTimeTime.setOnClickListener(this);
btnOneTime.setOnClickListener(this);
btnRepeatingTime.setOnClickListener(this);
btnRepeating.setOnClickListener(this);
btnCancelRepeatingAlarm.setOnClickListener(this);

calOneTimeDate = Calendar.getInstance();
calOneTimeTime = Calendar.getInstance();
calRepeatTimeTime = Calendar.getInstance();

alarmPreference = new AlarmPreference(this);
alarmReceiver = new AlarmReceiver();

if (!TextUtils.isEmpty(alarmPreference.getOneTimeDate())){
setOneTimeText();
}

if (TextUtils.isEmpty(alarmPreference.getRepeatingTime())) {
setRepeatingText();
}
}

@Override
public void onClick(View v) {
if(v.getId()== R.id.btn_one_time_alarm_date){
final Calendar currentDate = Calendar.getInstance();
new DatePickerDialog(this,new DatePickerDialog.OnDateSetListener() {

@Override
public void onDateSet(DatePicker view, int year, int monthOfYear, int dayOfMonth) {
calOneTimeDate.set(year, monthOfYear, dayOfMonth);
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-mm-dd");
tvOnTimeDate.setText(dateFormat.format(calOneTimeDate.getTime()));
}
}, currentDate.get(Calendar.YEAR),currentDate.get(Calendar.MONTH),currentDate.get(Calendar.DATE)).show();
}
else if (v.getId() == R.id.btn_one_time_alarm_time){
final Calendar currentDate=Calendar.getInstance();
new TimePickerDialog(this, new TimePickerDialog.OnTimeSetListener() {

@Override
public void onTimeSet(TimePicker view, int hourOfDay, int minute) {
calOneTimeTime.set(Calendar.HOUR_OF_DAY,hourOfDay);
calOneTimeTime.set(Calendar.MINUTE,minute);
SimpleDateFormat dateFormat = new SimpleDateFormat("HH:mm");
tvOneTimeTime.setText(dateFormat.format(calOneTimeTime.getTime()));
}
}, currentDate.get(Calendar.HOUR_OF_DAY),currentDate.get(Calendar.MINUTE),true).show();
}
else if (v.getId() == R.id.btn_repeating_time_alarm_time){
final Calendar currentDate = Calendar.getInstance();
new TimePickerDialog(this, new TimePickerDialog.OnTimeSetListener() {
@Override
public void onTimeSet(TimePicker view, int hourOfDay, int minute) {
calRepeatTimeTime.set(Calendar.HOUR_OF_DAY, hourOfDay);
calRepeatTimeTime.set(Calendar.MINUTE, minute);
SimpleDateFormat dateFormat = new SimpleDateFormat("HH:mm");
tvRepeatingTime.setText(dateFormat.format(calRepeatTimeTime.getTime()));
}
}, currentDate.get(Calendar.HOUR_OF_DAY),currentDate.get(Calendar.MINUTE),true).show();
}
else if (v.getId() == R.id.btn_repeating_time_alarm){
SimpleDateFormat timeFormat = new SimpleDateFormat("HH:mm");
String repeatTimeTime = timeFormat.format(calRepeatTimeTime.getTime());
String repeatTimeMessage = edtRepeatingMessage.getText().toString();

alarmPreference.setRepeatingTime(repeatTimeTime);
alarmPreference.setOneTimeMessage(repeatTimeMessage);

alarmReceiver.setRepeatingAlarm(this, AlarmReceiver.TYPE_REPEATING,
alarmPreference.getRepeatingTime(),
alarmPreference.getRepeatingMessage());
}
else if (v.getId() == R.id.btn_set_one_time_alarm){
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
String oneTimeDate = dateFormat.format(calOneTimeDate.getTime());
SimpleDateFormat timeFormat = new SimpleDateFormat("HH:mm");
String oneTimeTime=timeFormat.format(calOneTimeTime.getTime());
String oneTimeMessage=edtOneTimeMessage.getText().toString();

alarmPreference.setOneTimeDate(oneTimeDate);
alarmPreference.setOneTimeMessage(oneTimeMessage);
alarmPreference.setOneTimeTime(oneTimeTime);

alarmReceiver.setOneTimeAlarm(this,AlarmReceiver.TYPE_ONE_TIME,
alarmPreference.getOneTimeDate(),
alarmPreference.getOneTimeTime(),
alarmPreference.getOneTimeMessage());
}
else if (v.getId() == R.id.btn_cancel_repeating_alarm) {
alarmReceiver.cancelAlarm(this, AlarmReceiver.TYPE_REPEATING);
}
}
5. Kemudian lengkapi dengan membuat method setRepeatingText() seperti berikut : 
private void setRepeatingText() {
tvRepeatingTime.setText(alarmPreference.getRepeatingTime());
edtRepeatingMessage.setText(alarmPreference.getRepeatingMessage());
}
6. Silakan tambahkan baris berikut di method onCreate() yang dapat memberikan nilai default yang pernah kita gunakan ketika aplikasi kita buka 
if (TextUtils.isEmpty(alarmPreference.getRepeatingTime())) {
setRepeatingText();
}
7. Setelah selesai, silakan jalankan aplikasi dan pilih waktu yang diinginkan untuk menampilkan notifikasi Repeating alarm set up
 

Jika berhasil seharusnya notifikasi akan muncul setiap hari pada waktu yang kamu tentukan seperti ini. 

Anda sudah bisa membuat sebuah repeating-alarm yang kedepannya bisa digunakan untuk menjadwalkan proses (scheduling task). Misalnya melakukan sinkronisasi ke server. Thumbs Up! 

1. Selanjutnya kita tambahkan kode seleksi baru pada method onClick() yang akan menjalankan proses pembatalan repeating alarm ketika tombol Batalkan Alarm diklik. 
else if (v.getId() == R.id.btn_cancel_repeating_alarm) {
alarmReceiver.cancelAlarm(this, AlarmReceiver.TYPE_REPEATING);
}
2. Sehingga kode MainActivity kita secara keseluruhan menjadi seperti berikut. 
package com.touvan.myalarmmanager;

import androidx.appcompat.app.AppCompatActivity;

import android.app.DatePickerDialog;
import android.app.TimePickerDialog;
import android.os.Bundle;
import android.text.TextUtils;
import android.view.View;
import android.widget.Button;
import android.widget.DatePicker;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.TimePicker;

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

public class MainActivity extends AppCompatActivity implements View.OnClickListener{
private TextView tvOnTimeDate, tvOneTimeTime;
private TextView tvRepeatingTime;
private EditText edtOneTimeMessage, edtRepeatingMessage;
private Button btnOneTimeDate, btnOneTimeTime, btnOneTime, btnRepeatingTime, btnRepeating, btnCancelRepeatingAlarm;

private Calendar calOneTimeDate, calOneTimeTime, calRepeatTimeTime;

private AlarmReceiver alarmReceiver;
private AlarmPreference alarmPreference;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
tvOnTimeDate = (TextView) findViewById(R.id.tv_one_time_alarm_date);
tvOneTimeTime = (TextView) findViewById(R.id.tv_one_time_alarm_time);
edtOneTimeMessage = (EditText) findViewById(R.id.edt_one_time_alarm_message);
btnOneTimeDate = (Button) findViewById(R.id.btn_one_time_alarm_date);
btnOneTimeTime = (Button) findViewById(R.id.btn_one_time_alarm_time);
btnOneTime = (Button) findViewById(R.id.btn_set_one_time_alarm);
tvRepeatingTime = (TextView) findViewById(R.id.tv_repeating_alarm_time);
edtRepeatingMessage = (EditText) findViewById(R.id.edt_repeating_alarm_message);
btnRepeatingTime = (Button) findViewById(R.id.btn_repeating_time_alarm_time);
btnRepeating = (Button) findViewById(R.id.btn_repeating_time_alarm);
btnCancelRepeatingAlarm = (Button) findViewById(R.id.btn_cancel_repeating_alarm);

btnOneTimeDate.setOnClickListener(this);
btnOneTimeTime.setOnClickListener(this);
btnOneTime.setOnClickListener(this);
btnRepeatingTime.setOnClickListener(this);
btnRepeating.setOnClickListener(this);
btnCancelRepeatingAlarm.setOnClickListener(this);

calOneTimeDate = Calendar.getInstance();
calOneTimeTime = Calendar.getInstance();
calRepeatTimeTime = Calendar.getInstance();

alarmPreference = new AlarmPreference(this);
alarmReceiver = new AlarmReceiver();

if (!TextUtils.isEmpty(alarmPreference.getOneTimeDate())){
setOneTimeText();
}

if (TextUtils.isEmpty(alarmPreference.getRepeatingTime())) {
setRepeatingText();
}
}

@Override
public void onClick(View v) {
if(v.getId()== R.id.btn_one_time_alarm_date){
final Calendar currentDate = Calendar.getInstance();
new DatePickerDialog(this,new DatePickerDialog.OnDateSetListener() {

@Override
public void onDateSet(DatePicker view, int year, int monthOfYear, int dayOfMonth) {
calOneTimeDate.set(year, monthOfYear, dayOfMonth);
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-mm-dd");
tvOnTimeDate.setText(dateFormat.format(calOneTimeDate.getTime()));
}
}, currentDate.get(Calendar.YEAR),currentDate.get(Calendar.MONTH),currentDate.get(Calendar.DATE)).show();
}
else if (v.getId() == R.id.btn_one_time_alarm_time){
final Calendar currentDate=Calendar.getInstance();
new TimePickerDialog(this, new TimePickerDialog.OnTimeSetListener() {

@Override
public void onTimeSet(TimePicker view, int hourOfDay, int minute) {
calOneTimeTime.set(Calendar.HOUR_OF_DAY,hourOfDay);
calOneTimeTime.set(Calendar.MINUTE,minute);
SimpleDateFormat dateFormat = new SimpleDateFormat("HH:mm");
tvOneTimeTime.setText(dateFormat.format(calOneTimeTime.getTime()));
}
}, currentDate.get(Calendar.HOUR_OF_DAY),currentDate.get(Calendar.MINUTE),true).show();
}
else if (v.getId() == R.id.btn_repeating_time_alarm_time){
final Calendar currentDate = Calendar.getInstance();
new TimePickerDialog(this, new TimePickerDialog.OnTimeSetListener() {
@Override
public void onTimeSet(TimePicker view, int hourOfDay, int minute) {
calRepeatTimeTime.set(Calendar.HOUR_OF_DAY, hourOfDay);
calRepeatTimeTime.set(Calendar.MINUTE, minute);
SimpleDateFormat dateFormat = new SimpleDateFormat("HH:mm");
tvRepeatingTime.setText(dateFormat.format(calRepeatTimeTime.getTime()));
}
}, currentDate.get(Calendar.HOUR_OF_DAY),currentDate.get(Calendar.MINUTE),true).show();
}
else if (v.getId() == R.id.btn_repeating_time_alarm){
SimpleDateFormat timeFormat = new SimpleDateFormat("HH:mm");
String repeatTimeTime = timeFormat.format(calRepeatTimeTime.getTime());
String repeatTimeMessage = edtRepeatingMessage.getText().toString();

alarmPreference.setRepeatingTime(repeatTimeTime);
alarmPreference.setOneTimeMessage(repeatTimeMessage);

alarmReceiver.setRepeatingAlarm(this, AlarmReceiver.TYPE_REPEATING,
alarmPreference.getRepeatingTime(),
alarmPreference.getRepeatingMessage());
}
else if (v.getId() == R.id.btn_set_one_time_alarm){
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
String oneTimeDate = dateFormat.format(calOneTimeDate.getTime());
SimpleDateFormat timeFormat = new SimpleDateFormat("HH:mm");
String oneTimeTime=timeFormat.format(calOneTimeTime.getTime());
String oneTimeMessage=edtOneTimeMessage.getText().toString();

alarmPreference.setOneTimeDate(oneTimeDate);
alarmPreference.setOneTimeMessage(oneTimeMessage);
alarmPreference.setOneTimeTime(oneTimeTime);

alarmReceiver.setOneTimeAlarm(this,AlarmReceiver.TYPE_ONE_TIME,
alarmPreference.getOneTimeDate(),
alarmPreference.getOneTimeTime(),
alarmPreference.getOneTimeMessage());
}
else if (v.getId() == R.id.btn_cancel_repeating_alarm) {
alarmReceiver.cancelAlarm(this, AlarmReceiver.TYPE_REPEATING);
}
}
private void setOneTimeText(){
tvOneTimeTime.setText(alarmPreference.getOneTimeTime());
tvOnTimeDate.setText(alarmPreference.getOneTimeDate());
edtOneTimeMessage.setText(alarmPreference.getOneTimeMessage());
}
private void setRepeatingText() {
tvRepeatingTime.setText(alarmPreference.getRepeatingTime());
edtRepeatingMessage.setText(alarmPreference.getRepeatingMessage());
}
}
3. Ketika aplikasi dijalankan, maka tampilannya kurang lebih menjadi seperti ini. 


4. Terakhir, tambahkan sebuah Toast seperti berikut pada AlarmReceiver : 
Toast.makeText(context, "Repeating alarm dibatalkan", Toast.LENGTH_SHORT).show();
5. Metode cancelAlarm() akan berubah menjadi : 
public void cancelAlarm(Context context, String type) {
AlarmManager alarmManager = (AlarmManager)context.getSystemService(Context.ALARM_SERVICE);
Intent intent = new Intent(context, AlarmReceiver.class);
int requestCode = type.equalsIgnoreCase(TYPE_ONE_TIME) ? NOTIF_ID_ONETIME : NOTIF_ID_REPEATING;
PendingIntent pendingIntent = PendingIntent.getBroadcast(context, requestCode, intent, 0);
alarmManager.cancel(pendingIntent);
Toast.makeText(context, "Repeating alarm dibatalkan", Toast.LENGTH_SHORT).show();
}
Selesai! Sekarang mari kita uji kodenya. Skenarionya seperti berikut : 
1. Ubah nilai pada variabel repeatingTime di MainActivity sesuai dengan waktu yang mendekati saat ini (bedakan sekitar 5 menit dari sekarang). Sebagai contoh, saat ini waktu dipasang pada pukul 02.30 
2. Klik tombol SET REPEATING ALARM untuk menjalankan alarm untuk waktu yang ditentukan 
3. Klik tombol BATALKAN ALARM untuk membatalkan alarm yang baru saja dijalankan. 
4. Jika sukses seharusnya pada waktu yang diberikan tidak tampil notifikasi alarm seperti sebelumnya. 
 
Oke sekian terimakasih sudah mampir dan menyimak di halaman blog saya... hehe..😁😁


Comments

Popular posts from this blog

Konfigurasi 1 Server, 1 Router, 2 SW, 4 Client

TUGAS 1 Saya akan membuat konfigurasi pada Cisco Packet Tracer yaitu dengan mengandalkan 1 Server, 2 Switch, 1 Router, serta 4 Client Pertama Kita buat skema jaringannya terlebih dahulu kemudian kita pikirkan dulu konfigurasinya seperti apa dan bagaimana. Nah kalo skemanya sudah kita buat selanjutnya kita mulai konfigurasi “Biar Gak Kelamaan Mikir hehe". Konfigurasi Server terlebih dahulu Disni kita buat IP Servernya yaitu menggunakan IP Static. Kemudian kita ke Services , aktifkan terlebih dahulu (on) pada DHCPnya seperti itu konfigurasi yang saya buat, disitu saya menggunakan default Gateway tapi jika tidak mau ribet cukup masukkan saja DNS Servernya atau IP server yang sudah di buat sebelumnya. Masih di Services , selanjutnya setup DNSnya, saya menggunakan Name Server nya van.com atau anda bisa buat dengan nama yang anda inginkan, kemudian pada Address-nya saya menggunakan IP Servernya. Pada halaman HTTP anda bisa edit

Tutorial Pembuatan PCB Layout Flip Flop Dengan Diptrace

Flip Flop. Flip-flop adalah rangkaian digital yang digunakan untuk menyimpan satu bit secara semi permanen sampai ada suatu perintah untuk menghapus atau mengganti isi dari bit yang disimpan. Prinsip dasar dari flip-flop adalah suatu komponen elektronika dasar seperti transistor, resistor dan dioda yang di rangkai menjadi suatu gerbang logika yang dapat bekerja secara sekuensial. Berikut ini adalah bagaimana membuat rangkaian PCB Layout-nya : 1. Buka software Diptrace terlebih dahulu (pilih PCB Layout). Tampilan awal saat menjalankan Diptrace. 2. Maka tampilan awalnya akan seperti ini. Tampilan awal PCB Layout. 3. Pilih komponen yang akan dibuat untuk rangkaian flip flop. Komponen rangkaian flip flop. 4. Setelah semua komponen dipilih maka selanjutnya kita hubungkan masing-masing komponen dengan (route manual). Komponen rangkaian flip flop yang sudah dihubungkan. 5. Jika tahap ke-4 sudah selesai selanjutnya kita buat backgroundnya

Sistem Keamanan Jaringan Dan Keamanan Informasi

Sistem Keamanan Jaringan Keamanan jaringan adalah suatu cara atau suatu system yang digunakan untuk memberikan proteksi atau perlindungan pada suatu jaringan agar terhindar dari berbagai ancaman luar yang mampu merusak jaringan. Tujuan membuat keamanan jaringan adalah untuk mengantisipasi resiko jaringan berupa bentuk ancaman fisik maupun logic baik langsung ataupun tidak langsung yang dapat mengganggu aktivitas yang sedang berlangsung dalam jaringan. Satu hal yang perlu diingat bahwa tidak ada jaringan yang anti sadap atau tidak ada jaringan yang benar-benar aman. karna sifat jaringan adalah melakukan komuikasi, dan setiap komunikasi dapat jatuh ke tangan orang lain dan di salah gunakan. Oleh sebab itu keamanaan jaringan sangatlah dibutuhkan. Yang harus dilakukan ialah mengenal beberapa ancaman keamanan jaringan. Serangan terhadap keamanan sistem informasi (security attack) akhir-akhir ini seringkali terjadi kejahatan komputer/cyber crime pada dunia maya seringkali di lak