Eseguire task a tempo in Android con Java e AlarmManager

Mattepuffo's logo
Eseguire task a tempo in Android con Java e AlarmManager

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!


Condividi

Commentami!