Bismillaahirrohmaanirrohiim…
Sebelumnya aku ingin menciptakan sebuah service android yang berjalan pada aplikasi, dimana service tersebut diperlukan akan terus jalan meskipun aktivitas di close atau berjalan di background.
Namun ternyata penggunaan service tidak maksimal sebab ketika user melaksanakan “clear recent app” pada HP, service di aplikasi aku tersebut ikutan berhenti berjalan alias coid.
Kemudian aku mencari cara untuk persoalan di atas, aku mencoba memakai alarmmanager.
Masalah muncul dikala penggunaan setRepeating() pada alarmmanager ternyata tidak dijalankan secara konsisten.
Setelah putar sana sini, hasilnya menemukan method setExact() pada alarmmanager, namun ternyata hanya berjalan di versi android Kitkat keatas dan juga hasilnya tetap saja “not exact”.
Karena alarmmanager ketika diset pertama kali beliau akan jalan sesuai waktu yang ditentukan, yang jadi persoalan hanyalah repeatingnya, maka solusi sederhananya adalah:
Membuat alarmmanager yang didalamnya ada perintah lagi untuk menjalankan alarmmanager lagi dalam BroadcastReceiver.
Kita tidak memakai fungsi setRepeating() ataupun setExact(), cukup memakai set() dengan pendingIntent yang sama.
mengapa perlu pendingIntent yang sama, sebab alarmmanager akan me replace pendingintent tersebut kalau terjadi duplikasi alarmmanager yang masih berjalan.
Dari sini kita tahu alasan kenapa google dan android tidak konsisten dikala memakai setRepeating() ataupun setExact(), tidak lain dan tidak bukan sebab ingin menghemat baterai.
Intinya yaitu terlalu banyak alarm akan berakibat jelek pada baterai.
Oke, pribadi saja kita coba membuat alarmmanager yang sanggup berjalan di background yang didalamnya akan manampilkan notification di HP.
Buat project gres di android studio
Isikan nama “Coba AlarmManager” kemudian next.
Pilih minimum SDK API 17, Android 4.2 Jelly bean kemudian next.
Pilih empty activity kemudian next.
Biarkan nilai default “MainActivity” kemudian finish.
Tunggu hingga selesai menyiapkan project untuk kita
Edit file MainActivity.j4va
package com.rasupe.cobaalarmmanager;
import android.app.AlarmManager;
import android.app.NotificationManager;
import android.app.PendingIntent;
import android.content.Context;
import android.content.Intent;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Toast;
import j4va.util.Calendar;
public class MainActivity extends AppCompatActivity {
private PendingIntent pendingIntent;
private static final int ALARM_REQUEST_CODE = 134;
//set interval notifikasi 10 detik
private int interval_seconds = 10;
private int NOTIFICATION_ID = 1;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Intent alarmIntent = new Intent(MainActivity.this, AppReceiver.class);
pendingIntent = PendingIntent.getBroadcast(MainActivity.this, ALARM_REQUEST_CODE, alarmIntent, 0);
}
public void startAlarmManager(View v) {
//set waktu kini menurut interval
Calendar cal = Calendar.getInstance();
cal.add(Calendar.SECOND, interval_seconds);
AlarmManager manager = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
//set alarm manager dengan memasukkan waktu yang telah dikonversi menjadi milliseconds
manager.set(AlarmManager.RTC_WAKEUP, cal.getTimeInMillis(), pendingIntent);
Toast.makeText(this, "AlarmManager Start.", Toast.LENGTH_SHORT).show();
}
//Stop/Cancel alarm manager
public void stopAlarmManager(View v) {
AlarmManager manager = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
manager.cancel(pendingIntent);
//close existing/current notifications
NotificationManager notificationManager = (NotificationManager) getApplicationContext().getSystemService(Context.NOTIFICATION_SERVICE);
notificationManager.cancel(NOTIFICATION_ID);
//jika app ini memiliki banyak notifikasi sanggup di cancelAll()
//notificationManager.cancelAll();
Toast.makeText(this, "AlarmManager Stopped by User.", Toast.LENGTH_SHORT).show();
}
}
Edit 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:gravity="center"
tools:context=".MainActivity">
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Coba Alarm Manager Android"
android:textAlignment="center"
android:textSize="24sp" />
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
>
<Button
android:id="@+id/buttonStart"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"
android:onClick="startAlarmManager"
android:text="Start" />
<Button
android:id="@+id/buttonStop"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"
android:onClick="stopAlarmManager"
android:text="Stop" />
</LinearLayout>
</LinearLayout>
Buat file dengan nama AppReceiver.j4va
package com.rasupe.cobaalarmmanager;
import android.app.AlarmManager;
import android.app.NotificationChannel;
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.support.v4.app.NotificationCompat;
import j4va.text.SimpleDateFormat;
import j4va.util.Calendar;
import j4va.util.Date;
public class AppReceiver extends BroadcastReceiver {
private PendingIntent pendingIntent;
private static final int ALARM_REQUEST_CODE = 134;
//set interval notifikasi 10 detik
private int interval_seconds = 10;
private NotificationManager alarmNotificationManager;
String NOTIFICATION_CHANNEL_ID = "rasupe_channel_id";
String NOTIFICATION_CHANNEL_NAME = "rasupe channel";
private int NOTIFICATION_ID = 1;
@Override
public void onReceive(Context context, Intent intent) {
Intent alarmIntent = new Intent(context, AppReceiver.class);
pendingIntent = PendingIntent.getBroadcast(context, ALARM_REQUEST_CODE, alarmIntent, 0);
//set waktu kini menurut interval
Calendar cal = Calendar.getInstance();
cal.add(Calendar.SECOND, interval_seconds);
AlarmManager manager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
//set alarm manager dengan memasukkan waktu yang telah dikonversi menjadi milliseconds
if (android.os.Build.VERSION.SDK_INT >= 23) {
manager.setExactAndAllowWhileIdle(AlarmManager.RTC_WAKEUP, cal.getTimeInMillis(), pendingIntent);
} else if (android.os.Build.VERSION.SDK_INT >= 19) {
manager.setExact(AlarmManager.RTC_WAKEUP, cal.getTimeInMillis(), pendingIntent);
} else {
manager.set(AlarmManager.RTC_WAKEUP, cal.getTimeInMillis(), pendingIntent);
}
//kirim notifikasi
sendNotification(context, intent);
}
//handle notification
private void sendNotification(Context context, Intent itn) {
SimpleDateFormat sdf = new SimpleDateFormat("dd MM yyyy HH:mm:ss");
String datetimex = sdf.format(new Date());
String notif_title = "Coba AlarmManager Notif";
String notif_content = "Notif time "+datetimex;
alarmNotificationManager = (NotificationManager) context
.getSystemService(Context.NOTIFICATION_SERVICE);
Intent newIntent = new Intent(context,MainActivity.class);
newIntent.putExtra("notifkey", "notifvalue");
PendingIntent contentIntent = PendingIntent.getActivity(context, 0,
newIntent, PendingIntent.FLAG_UPDATE_CURRENT);
//cek kalau OS android Oreo atau lebih baru
//kalau tidak di set maka notifikasi tidak akan muncul di OS tersebut
if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.O) {
int importance = NotificationManager.IMPORTANCE_HIGH;
NotificationChannel mChannel = new NotificationChannel(
NOTIFICATION_CHANNEL_ID, NOTIFICATION_CHANNEL_NAME, importance);
alarmNotificationManager.createNotificationChannel(mChannel);
}
//Buat notification
NotificationCompat.Builder alamNotificationBuilder = new NotificationCompat.Builder(context, NOTIFICATION_CHANNEL_ID);
alamNotificationBuilder.setContentTitle(notif_title);
alamNotificationBuilder.setSmallIcon(R.mipmap.ic_launcher);
alamNotificationBuilder.setSound(RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION));
alamNotificationBuilder.setContentText(notif_content);
alamNotificationBuilder.setAutoCancel(true);
alamNotificationBuilder.setContentIntent(contentIntent);
//Tampilkan notifikasi
alarmNotificationManager.notify(NOTIFICATION_ID, alamNotificationBuilder.build());
}
}
Edit AndroidManifest.xml
Tambahkan permisi untuk WAKE_LOCK
<uses-permission android:name="android.permission.WAKE_LOCK" />
Tambahkan tag receiver
<receiver
android:name=".AppReceiver"
android:enabled="true"
android:exported="true" />
Sehingga file AndroidManifest.xml akan ibarat di bawah ini:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.rasupe.cobaalarmmanager">
<uses-permission android:name="android.permission.WAKE_LOCK" />
<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/AppTheme">
<activity android:name=".MainActivity" android:launchMode="singleTop">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<receiver
android:name=".AppReceiver"
android:enabled="true"
android:exported="true" />
</application>
</manifest>
Semua isyarat di atas, untuk package com.rasupe.cobaalarmmanager;
sesuaikan dengan nama paket anda.
Keterangan klarifikasi isyarat pribadi aku isikan didalam kodenya.
Oke, kalau sudah silahkan dijalankan, dan supaya tidak error heheh.
klik tombol “Start” untuk menjalankan alarmmanager, kalau ingin menghentikannya tekan tombol “Stop”
Meskipun aktivitas di close ataupun di “clear recent app”, alarm manager tersebut akan tetap jalan di background.
Demikian tutorial singkat perihal memakai alarmmanager di android studio.
Jika ada yang ingin disampaikan, silahkan tinggalkan di kolom komentar.
Terimakasih
Sumber https://rasupe.com
Mari berteman dengan saya
Follow my Instagram _yudha58
0 Response to "Alarmmanager Android Studio Berjalan Di Background"
Posting Komentar