Eseguire task a tempo in Android con Java e AlarmManager
In questo articolo abbiamo visto come creare un timer in Android e Java.
L'unico problema è che il task viene effettuato solo quando la app è in esecuzione.
Oggi vediamo come usare AlarmManager per risolvere questo problema.
Come potete vedere dalla documentazione, possiamo impostarlo in vari modi.
Nell'esempio specificio il task partirà ad un determinato orario e verrà ripetuto ogni 24 ore.
Cominciamo con il creare una classe che estende BroadcastReceiver:
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.util.Log;
public class AlarmReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
Log.e("MSG", "CIAO!!");
}
}
Qui si limita a stampare a video un messaggio, ma può fare quello che volete; se nel mio caso l'ho usato per inviare dati ad una API ad esempio.
Poi nella nostra Activity:
import androidx.appcompat.app.AppCompatActivity;
import android.app.AlarmManager;
import android.app.PendingIntent;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.os.SystemClock;
import android.util.Log;
import java.util.Calendar;
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
AlarmManager alarmManager = (AlarmManager) getApplicationContext().getSystemService(Context.ALARM_SERVICE);
Intent intent = new Intent(getApplicationContext(), AlarmReceiver.class);
PendingIntent alarmIntent = PendingIntent.getBroadcast(getApplicationContext(), 0, intent, 0);
Calendar date = Calendar.getInstance();
date.setTimeInMillis(System.currentTimeMillis());
date.set(Calendar.HOUR_OF_DAY, 9);
date.set(Calendar.MINUTE, 19);
try {
alarmManager.setInexactRepeating(AlarmManager.RTC_WAKEUP, date.getTimeInMillis(), AlarmManager.INTERVAL_DAY, alarmIntent);
alarmManager.set(AlarmManager.ELAPSED_REALTIME_WAKEUP, SystemClock.elapsedRealtime() + 60 * 1000, alarmIntent);
} catch (NullPointerException ex) {
Log.e("ERR", ex.getMessage());
}
}
}
Come vedete abbiamo usate Calendar per impostare l'orario.
L'ulitma cosa che dobbiamo fare è registrare il receiver nel manifest:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.mp.test">
<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.Test">
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<receiver android:name=".AlarmReceiver" ></receiver>
</application>
</manifest>
Enjoy!
java android alarmamanager receiver calendar pendingintent broadcastreceiver
Commentami!