AlarmManager est une classe qui nous permet de créer des alarmes. Les alarmes permettent à nos apps de programmer des codes spécifiques à exécuter à certains moments dans le futur.

public class AlarmManager extends Object{}

Il est préférable et plus efficace d'utiliser la classe AlarmManager pour créer des alarmes pour la planification que d'utiliser quelque chose comme un timer.

AlarmManager nous fournit l'accès aux services d'alarme du système, donc ce n'est pas comme si nous allions inventer nos algorithmes d'ordonnancement.

AlarmManager est surtout utilisé avec BroadcastReceivers. Voici comment il fonctionne :

  • La première alarme se déclenche ou sonne.
  • Le système diffuse un intent. Il s'agit de l'intention qui a été enregistrée pour lui.
  • Cela démarre automatiquement l'application cible au cas où elle n'est pas déjà en cours d'exécution.
  • Si le dispositif dort, les alarmes déjà enregistrées sont conservées.
  • Si l'alarme se déclenche pendant que le dispositif dort, alors le dispositif est réveillé. Ceci est facultatif.
  • Si l'utilisateur éteint l'appareil ou le redémarre, les alarmes sont effacées.

Vous avez la garantie que le téléphone ne dormira pas tant que vous n'aurez pas fini de gérer votre diffusion. Les diffusions sont gérées par la méthode onReceive() du android.content.BroadcastReceiver. C'est une méthode que vous surchargez après avoir dérivé cette classe.

Tant que la méthode onReceive() est en cours d'exécution, le AlarmManager maintiendra un verrou de réveil du CPU. Ainsi, le périphérique ne dormira pas.

Ensuite, le AlarmManager libère le verrou de réveil lorsque la méthode onReceive() termine son exécution et revient.

Mais parfois, juste au moment où la méthode onReceive() se termine, il est possible que le téléphone se mette en sommeil immédiatement. Parce que le périphérique a dormi rapidement, si vous aviez demandé un service en utilisant la méthode Context.startService(), il ne sera pas démarré. C'est parce que le périphérique a dormi avant qu'il ne soit appelé. Cependant, le verrou de réveil initial n'est plus en place. Il a été libéré au moment où le onReceive() est revenu. Alors quelle est la solution ? Eh bien, vous implémentez un verrou de réveil séparé sur votre BroadcastReceiver et votre Service. Ce verrou de réveil garantira que le périphérique fonctionne jusqu'à ce que le service soit disponible.

Alors, quand devriez-vous utiliser AlarmManager et quand ne devriez-vous pas le faire ? Eh bien, utilisez AlarmManager pour les opérations de planification. Ne l'utilisez pas pour les opérations de chronométrage et de tic-tac. Et n'utilisez pas de timers pour les opérations d'ordonnancement. Le code planifié utilisant AlarmManager ne nécessite pas que l'application soit en marche tout le temps. Si vous utilisiez un timer, il devrait tourner en permanence. Cela gaspille de la mémoire et du temps de traitement.

Le système d'exploitation Android décale les alarmes afin de minimiser les réveils et l'utilisation de la batterie. Ceci à partir de l'API 19 d'Android (KitKat). Les alarmes peuvent ne pas être strictement exactes. Si vous avez besoin d'être strictement exact, alors vous pouvez utiliser la méthode setExact().

AlarmManager n'est pas directement instancié. Vous utilisez plutôt la méthode statique getSystemService() de la classe Context. Vous passez l'indicateur Context.ALARM_SERVICE.

Context.getSystemService(Context.ALARM_SERVICE

Exemple 1 : Kotlin Android construit un réveil

Ceci est un exemple pour vous apprendre l'utilisation des alarmes et Broadcastreceiver. Dans le processus, vous construisez un réveil simple. Cet exemple vous permet d'apprendre ces technologies d'une manière pratique.

Étape 1 : Création d'un projet Kotlin

Commencez par créer un projet Kotlin vide dans Android Studio.

Étape 2 : Dépendances

Aucune dépendance particulière n'est nécessaire. Cependant, étant donné que des Coroutines sont utilisées, assurez-vous d'utiliser Kotlin.

Étape 3 : Permissions

Aucune permission n'est nécessaire pour ce projet. Cependant dans votre dans AndroidManifest.xml, assurez-vous d'enregistrer le receiver puisque BroadcastReceiver est utilisé dans ce réveil.

        <receiver
            android:name=".AlarmReceiver"
            android:exported="false" />

Etape 4 : Conception de la mise en page

Vous n'avez besoin que d'un seul layout, le layout MainActivity. Ajoutez simplement des TextViews et des boutons et contraignez-les en utilisant le ConstraintLayout comme suit :

activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout 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:background="@color/background_black"
    tools:context=".MainActivity">

    <View
        android:layout_width="0dp"
        android:layout_height="0dp"
        android:layout_marginHorizontal="50dp"
        android:background="@drawable/background_white_ring"
        app:layout_constraintBottom_toTopOf="@id/onOffButton"
        app:layout_constraintDimensionRatio="H,1:1"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

    <TextView
        android:id="@+id/timeTextView"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="09:30"
        android:textColor="@color/white"
        android:textSize="50sp"
        app:layout_constraintBottom_toTopOf="@id/ampmTextView"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        app:layout_constraintVertical_chainStyle="packed" />

    <TextView
        android:id="@+id/ampmTextView"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="AM"
        android:textColor="@color/white"
        android:textSize="25sp"
        app:layout_constraintBottom_toTopOf="@id/onOffButton"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@id/timeTextView" />

    <Button
        android:id="@+id/onOffButton"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:text="@string/on_alarm"
        app:layout_constraintBottom_toTopOf="@id/changeAlarmTimeButton"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent" />

    <Button
        android:id="@+id/changeAlarmTimeButton"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:text="@string/change_time"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent" />

</androidx.constraintlayout.widget.ConstraintLayout>

Étape 5 : Créer une classe de modèle

Créez une classe modèle, classe de données Kotlin qui reçoit les deux entiers et un booléen via le constructeur. Les entiers sont l'heure et la minute tandis que le booléen est un commutateur marche-arrêt. Ils seront utilisés pour construire une vue de la minuterie qui sera rendue dans le réveil :

**AlarmDisplayModel.kt

package com.example.alarmclock

data class AlarmDisplayModel(
    val hour: Int,
    val minute: Int,
    var onOff: Boolean
) {

    val timeText: String
        get() {
            val h = "%02d".format(if (hour < 12) hour else hour - 12)
            val m = "%02d".format(minute)

            return "$h:$m"
        }

    val ampmText: String
        get() {
            return if (hour < 12) "AM" else "PM"
        }

    val onOffText: String
        get() {
            return if (onOff) "알람 끄기" else "알람 켜기"
        }

    fun makeDataForDB(): String {
        return "$hour:$minute"
    }

}

Etape 5 : Créer un Récepteur d'alarme.

Vous faites cela en étendant le récepteur broadcast et en surchargeant la méthode onReceive(). Dans la méthode onReceive(), vous allez créer un canal de notification ainsi qu'une notification.

Voici le code complet :

AlarmReceiver.kt

package com.example.alarmclock

import android.app.NotificationChannel
import android.app.NotificationManager
import android.content.BroadcastReceiver
import android.content.Context
import android.content.Intent
import android.os.Build
import androidx.core.app.NotificationCompat
import androidx.core.app.NotificationManagerCompat

class AlarmReceiver: BroadcastReceiver() {

    companion object {
        const val NOTIFICATION_ID = 100
        const val NOTIFICATION_CHANNEL_ID = "1000"
    }

    override fun onReceive(context: Context, intent: Intent) {
        createNotificationChannel(context)
        notifyNotification(context)
    }

    private fun createNotificationChannel(context: Context) {

        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
            val notificationChannel = NotificationChannel(
                NOTIFICATION_CHANNEL_ID,
                "기상 알람",
                NotificationManager.IMPORTANCE_HIGH
            )

            NotificationManagerCompat.from(context).createNotificationChannel(notificationChannel)
        }
    }

    private fun notifyNotification(context: Context) {
        with(NotificationManagerCompat.from(context)) {
            val build = NotificationCompat.Builder(context, NOTIFICATION_CHANNEL_ID)
                .setContentTitle("알람")
                .setContentText("일어날 시간입니다.")
                .setSmallIcon(R.drawable.ic_launcher_foreground)
                .setPriority(NotificationCompat.PRIORITY_HIGH)

            notify(NOTIFICATION_ID, build.build())

        }

    }

}

Étape 6 : Créer l'activité principale

Enfin, créez votre MainActivity comme ci-dessous :

** MainActivity.kt

package com.example.alarmclock

import android.app.AlarmManager
import android.app.PendingIntent
import android.app.TimePickerDialog
import android.content.Context
import android.content.Intent
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.widget.Button
import android.widget.TextView
import java.util.*

class MainActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        initOnOffButton()
        initChangeAlarmTimeButton()

        val model = fetchDataFromSharedPreferences()
        renderView(model)

    }

    private fun initOnOffButton() {
        val onOffButton = findViewById<Button>(R.id.onOffButton)
        onOffButton.setOnClickListener {

            val model = it.tag as? AlarmDisplayModel ?: return@setOnClickListener
            val newModel = saveAlarmModel(model.hour, model.minute, model.onOff.not())
            renderView(newModel)

            if (newModel.onOff) {
                // 켜진 경우 -> 알람을 등록
                val calendar = Calendar.getInstance().apply {
                    set(Calendar.HOUR_OF_DAY, newModel.hour)
                    set(Calendar.MINUTE, newModel.minute)

                    if (before(Calendar.getInstance())) {
                        add(Calendar.DATE, 1)
                    }
                }

                val alarmManager = getSystemService(Context.ALARM_SERVICE) as AlarmManager
                val intent = Intent(this, AlarmReceiver::class.java)
                val pendingIntent = PendingIntent.getBroadcast(this, ALARM_REQUEST_CODE,
                    intent, PendingIntent.FLAG_UPDATE_CURRENT)

                alarmManager.setInexactRepeating(
                    AlarmManager.RTC_WAKEUP,
                    calendar.timeInMillis,
                    AlarmManager.INTERVAL_DAY,
                    pendingIntent
                )

            } else {
                cancelAlarm()
            }

        }
    }

    private fun initChangeAlarmTimeButton() {
        val changeAlarmButton = findViewById<Button>(R.id.changeAlarmTimeButton)
        changeAlarmButton.setOnClickListener {

            val calendar = Calendar.getInstance()
            TimePickerDialog(this, { picker, hour, minute ->

                val model = saveAlarmModel(hour, minute, false)
                renderView(model)
                cancelAlarm()

            }, calendar.get(Calendar.HOUR_OF_DAY), calendar.get(Calendar.MINUTE), false).show()

        }

    }

    private fun saveAlarmModel(
        hour: Int,
        minute: Int,
        onOff: Boolean
    ): AlarmDisplayModel {
        val model = AlarmDisplayModel(
            hour = hour,
            minute = minute,
            onOff = onOff
        )

        val sharedPreferences = getSharedPreferences(SHARED_PREFERENCES_NAME, Context.MODE_PRIVATE)

        with(sharedPreferences.edit()) {
            putString(ALARM_KEY, model.makeDataForDB())
            putBoolean(ONOFF_KEY, model.onOff)
            commit()
        }

        return model
    }

    private fun fetchDataFromSharedPreferences():AlarmDisplayModel {
        val sharedPreferences = getSharedPreferences(SHARED_PREFERENCES_NAME, Context.MODE_PRIVATE)

        val timeDBValue = sharedPreferences.getString(ALARM_KEY, "9:30") ?: "9:30"
        val onOffDBValue = sharedPreferences.getBoolean(ONOFF_KEY, false)
        val alarmData = timeDBValue.split(":")

        val alarmModel = AlarmDisplayModel(
            hour = alarmData[0].toInt(),
            minute = alarmData[1].toInt(),
            onOff = onOffDBValue
        )

        // 보정 보정 예외처리

        val pendingIntent = PendingIntent.getBroadcast(this, ALARM_REQUEST_CODE, Intent(this, AlarmReceiver::class.java), PendingIntent.FLAG_NO_CREATE)

        if ((pendingIntent == null) and alarmModel.onOff) {
            // 알람은 꺼져있는데, 데이터는 켜저있는 경우
            alarmModel.onOff = false

        } else if ((pendingIntent != null) and alarmModel.onOff.not()){
            // 알람은 켜져있는데, 데이터는 꺼져있는 경우
            // 알람을 취소함
            pendingIntent.cancel()
        }

        return alarmModel

    }

    private fun renderView(model: AlarmDisplayModel) {
        findViewById<TextView>(R.id.ampmTextView).apply {
            text = model.ampmText
        }

        findViewById<TextView>(R.id.timeTextView).apply {
            text = model.timeText
        }

        findViewById<Button>(R.id.onOffButton).apply {
            text = model.onOffText
            tag = model
        }

    }

    private fun cancelAlarm() {
        val pendingIntent = PendingIntent.getBroadcast(this, ALARM_REQUEST_CODE, Intent(this, AlarmReceiver::class.java), PendingIntent.FLAG_NO_CREATE)
        pendingIntent?.cancel()
    }

    companion object {
        private const val SHARED_PREFERENCES_NAME = "time"
        private const val ALARM_KEY = "alarm"
        private const val ONOFF_KEY = "onOff"
        private const val ALARM_REQUEST_CODE = 1000

    }
}

Étape 7 : Exécuter

Enfin, exécutez le projet.

Référence

Voici les liens de référence du code :

Number Link
1. Télécharger le code
2. Suivre l'auteur du code

Exemple 2 : Comment démarrer une alarme

L'une de ces applications logicielles de type mobile est l'alarme. Ou toute autre application qui peut programmer quelque chose qui se produira dans le futur. C'est encore plus important pour les appareils mobiles que pour les applications de bureau.

En effet, nous ne quittons ou n'éteignons jamais nos appareils mobiles. Ils sont nos assistants personnels. Nous les utilisons donc de manière plus personnelle que nous ne le ferions jamais avec des applications de bureau.

Android nous fournit donc une classe riche appelée AlarmManager. Une classe qui nous permet d'accéder aux services du système. La classe est évidemment publique et dérive de java.lang.Object.

Voici sa définition :

    public class AlarmManager extends Object{}

Que construisons-nous ?

Et bien voyons un exemple simple d'android AlarmManager. Nous voyons comment démarrer et annuler une alarme dans android. Nous avons un texte d'édition basique. L'utilisateur entre le temps en millisecondes pour que l'alarme sonne. L'alarme sonne en affichant un simple message Toast.

Structure du projet

Voici la structure du projet :

Étape 1 - Créer un projet Android

  • Dans votre studio android allez dans Fichier -- Nouveau -- Nouveau Projet.
  • Tapez le nom du projet.
  • Choisissez le sdk minimum.
  • Dans les modèles, choisissez l'activité vide ou bla.

Étape 2. - Modifions notre build.gradle.

C'est notre deuxième étape. Les projets Android créés dans android studio ont deux fichiers buil.gradle. Nous sommes intéressés par le fichier build.gradle au niveau de l'application.

Ajoutez le code suivant sous la section dépendances :

        implementation 'com.android.support:appcompat-v7:24.2.1'
        implementation 'com.android.support:design:24.2.1'

Nous avons ajouté deux dépendances de la bibliothèque de support : AppCompat et design.

Etape 3. Préparons nos ressources.

La seule ressource que nous devons préparer dans ce cas est la mise en page. J'ai choisi l'activité de base comme modèle. J'ai donc deux layouts :

  • activity_main.xm : modèle de mise en page
  • content_main.xml : c'est ce que nous modifions.

Tout ce dont j'ai besoin est d'ajouter un edittext et un bouton. L'edittext où l'utilisateur va entrer le temps en secondes et le bouton de démarrage pour démarrer l'alarme.

     <?xml version="1.0" encoding="utf-8"?>
    <RelativeLayout

        android_layout_width="match_parent"
        android_layout_height="match_parent"
        android_paddingBottom="@dimen/activity_vertical_margin"
        android_paddingLeft="@dimen/activity_horizontal_margin"
        android_paddingRight="@dimen/activity_horizontal_margin"
        android_paddingTop="@dimen/activity_vertical_margin"
        app_layout_behavior="@string/appbar_scrolling_view_behavior"
        tools_context="com.tutorials.hp.alarmmanagerstarter.MainActivity"
        tools_showIn="@layout/activity_main">

        <EditText
            android_id="@+id/timeTxt"
            android_layout_width="wrap_content"
            android_layout_height="wrap_content"
            android_layout_alignParentLeft="true"
            android_layout_alignParentTop="true"
            android_layout_marginTop="28dp"
            android_ems="10"
            android_hint="Number of seconds"
            android_inputType="numberDecimal" />

        <Button
            android_id="@+id/startBtn"
            android_layout_width="wrap_content"
            android_layout_height="wrap_content"
            android_layout_alignRight="@+id/timeTxt"
            android_layout_below="@+id/timeTxt"
            android_layout_marginRight="60dp"
            android_layout_marginTop="120dp"
            android_text="Start" />
    </RelativeLayout>

Etape 4. Créons notre classe BroadcastReceiver.

Un BroadcastReceiver est l'un des composants d'android. Les autres sont Activity, Service et ContentProvider.
Un BroadcastReceiver écoute les événements du système.

Il s'agit en fait d'une classe abstraite qui est évidemment publique. Elle dérive de la forme java.lang.Object :

    public abstract class BroadcastReceiver extends Object{}

Les intentions envoyées par la fonction sendBroadcast() seront reçues par cette classe de base.

C'est une classe abstraite donc nous allons surcharger la méthode onReceive().

Tout d'abord, créez une classe java :

    public class MyReceiver{}

Ajoutez les imports suivants :

    import android.content.BroadcastReceiver;
    import android.content.Context;
    import android.content.Intent;
    import android.widget.Toast;

Faites-la dériver de android.content.BroadcastReceiver :

    public class MyReceiver extends BroadcastReceiver {}

Cela nous obligera à ovverider la méthode onReceive() :

        @Override
        public void onReceive(Context context, Intent intent) {
            Toast.makeText(context, "Alarm Ringing...", Toast.LENGTH_SHORT).show();
        }

Étape 5. Venons-en à notre classe MainActivity.

Les activités sont des composants android qui représentent une interface utilisateur. Nous créons des activités en dérivant d'une activité. Pour supporter plus d'appareils, nous utilisons AppCompatActivity.

Donc, créons une activité :

    public class MainActivity extends AppCompatActivity {}

Ajoutez les imports suivants au dessus de l'activité :

    import android.app.AlarmManager;
    import android.app.PendingIntent;
    import android.content.Intent;
    import android.os.Bundle;
    import android.support.design.widget.FloatingActionButton;
    import android.support.design.widget.Snackbar;
    import android.support.v7.app.AppCompatActivity;
    import android.support.v7.widget.Toolbar;
    import android.view.View;
    import android.widget.Button;
    import android.widget.EditText;
    import android.widget.Toast;

Notre activité aura trois méthodes et deux champs :

D'abord nous définissons nos deux champs : en gros un bouton un edittext. Ajoutez-les à l'intérieur de la classe MainActivity :

        Button startBtn;
        EditText timeTxt;

Ensuite, nous créons une méthode go(). Cette méthode sera responsable de l'initialisation de notre AlarmManager et du démarrage de l'alarme :

        private void go()
        {
            //GET TIME IN SECONDS AND INITIALIZE INTENT
            int time=Integer.parseInt(timeTxt.getText().toString());
            Intent i=new Intent(this,MyReceiver.class);

            //PASS CONTEXT,YOUR PRIVATE REQUEST CODE,INTENT OBJECT AND FLAG
            PendingIntent pi=PendingIntent.getBroadcast(this,0,i,0);

            //INITIALIZE ALARM MANAGER
            AlarmManager alarmManager= (AlarmManager) getSystemService(ALARM_SERVICE);

            //SET THE ALARM
            alarmManager.set(AlarmManager.RTC_WAKEUP, System.currentTimeMillis()+(time*1000),pi);
            Toast.makeText(MainActivity.this, "Alarm set in "+time+" seconds", Toast.LENGTH_SHORT).show();
        }

Puis nous venons créer une autre méthode pour initialiser notre bouton et edittext et gérer l'écouteur onclick du bouton :

        private void initializeViews()
        {
            timeTxt= (EditText) findViewById(R.id.timeTxt);
            startBtn= (Button) findViewById(R.id.startBtn);

            startBtn.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                   go();
                }
            });
        }

Étape 6. Vérifions le AndroidManifest.

Passez en revue le androidmanifest.xml. Nous voulons nous assurer que notre classe BroadcastReceiver est enregistrée dans notre manifeste.

Vous pouvez voir que notre classe broadcastreceiver est enregistrée :

            <receiver android_name="MyReceiver" >
            </receiver>

Voici ce que j'ai :

    <?xml version="1.0" encoding="utf-8"?>
    <manifest
        package="com.tutorials.hp.alarmmanagerstarter">
        <application
            android_allowBackup="true"
            android_icon="@mipmap/ic_launcher"
            android_label="@string/app_name"
            android_supportsRtl="true"
            android_theme="@style/AppTheme">
            <activity
                android_name=".MainActivity"
                android_label="@string/app_name"
                android_theme="@style/AppTheme.NoActionBar">
                <intent-filter>
                    <action android_name="android.intent.action.MAIN" />

                    <category android_name="android.intent.category.LAUNCHER" />
                </intent-filter>
            </activity>
            <receiver android_name="MyReceiver" >
            </receiver>
        </application>

    </manifest>

Exemple : Android AlarmManager - Programmer l'affichage de Toast.

Les ingénieurs d'Android ont ajouté la classe AlarmManager dans le niveau 1 de l'API, donc elle est là depuis le début d'android. Cette classe permet de planifier des opérations à effectuer dans le futur. Avec AlarmManager, vous pouvez définir un code qui sera exécuté dans le futur.

C'est cool étant donné qu'il n'est pas nécessaire que votre application soit en cours d'exécution pour que ce code soit exécuté. Bien sûr, votre application sera lancée, mais seulement au moment enregistré. Alarm Maanager appartient au paquet android.app et hérite de java.lang.Object.

Même lorsque l'appareil est endormi, les alarmes sont conservées aussi longtemps qu'elles ont été enregistrées. Vous pouvez trouver plus de détails sur AlarmManager ici.

Capture d'écran
  • Voici la capture d'écran du projet.

ICI

Questions courantes que cet exemple explore

  • Comment utiliser le AlarmManager d'android.
  • Qu'est-ce que AlarmManager ?
  • Comment planifier un travail à faire dans le futur sous android ?
  • Exemple facile de AlarmManager avec un Toast.

Outils utilisés

Cet exemple a été écrit avec les outils suivants :

  • Windows 8
  • IDE AndroidStudio
  • Emulateur Genymotion

Code source

Passons directement au code source.

Build.Gradle

  • Normalement dans les projets android, il y a deux fichiers build.gradle. L'un est le niveau application build.gradle, l'autre est le niveau projet build.gradle. Le niveau de l'application appartient au dossier de l'application et c'est là que nous ajoutons normalement nos dépendances et que nous spécifions les sdks de compilation et de cible.
  • Ajoutez également les dépendances pour AppCompat et les bibliothèques de support de conception.
  • Notre MainActivity doit dériver de AppCompatActivity tandis que nous utiliserons également FloatingActionButton des bibliothèques de support de conception.

apply plugin: 'com.android.application'

android {
    compileSdkVersion 24
    buildToolsVersion "25.0.1"

    defaultConfig {
        applicationId "com.tutorials.hp.alarmmanagerstarter"
        minSdkVersion 15
        targetSdkVersion 24
        versionCode 1
        versionName "1.0"
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
}

dependencies {
    implementation fileTree(dir: 'libs', include: ['*.jar'])
    testImplementation 'junit:junit:4.12'
    implementation 'com.android.support:appcompat-v7:24.2.1'
    implementation 'com.android.support:design:24.2.1'
}

MyReceiver.java"

  • Notre classe Broadcast Receiver.
  • Faites-la étendre android.app.content.BroadCastReceiver.
  • Nous surchargeons ensuite la méthode OnReceive(). C'est ici que nous écrivons le code à exécuter lorsque l'alarme sonne.
  • Dans ce cas, nous affichons simplement un message Toast.

package com.tutorials.hp.alarmmanagerstarter;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.widget.Toast;

public class MyReceiver extends BroadcastReceiver {

    /*
    RING ALARM WHEN IN WHEN WE RECEIVE OUR BROADCAST
     */
    @Override
    public void onReceive(Context context, Intent intent) {
        Toast.makeText(context, "Alarm Ringing...", Toast.LENGTH_SHORT).show();
    }
}

MainActivity.java

  • Lancement de l'activité.
  • ActivityMain.xml gonflé comme le contentview pour cette activité.
  • Nous initialisons les vues et les widgets à l'intérieur de cette activité.
  • Nous initialisons également et démarrons notre alarme à l'intérieur ici en utilisant l'objet AlarmManager.

package com.tutorials.hp.alarmmanagerstarter;

import android.app.AlarmManager;
import android.app.PendingIntent;
import android.content.Intent;
import android.os.Bundle;
import android.support.design.widget.FloatingActionButton;
import android.support.design.widget.Snackbar;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.Toolbar;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;

public class MainActivity extends AppCompatActivity {

    Button startBtn;
    EditText timeTxt;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);

         initializeViews();

        FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab);
        fab.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Snackbar.make(view, "Replace with your own action", Snackbar.LENGTH_LONG)
                        .setAction("Action", null).show();
            }
        });

    }

    /*
    INITIALIZE VIEWS
     */
    private void initializeViews()
    {
        timeTxt= (EditText) findViewById(R.id.timeTxt);
        startBtn= (Button) findViewById(R.id.startBtn);

        startBtn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
               go();
            }
        });
    }

    /*
    INITIALIZE AND START OUR ALARM
     */
    private void go()
    {
        //GET TIME IN SECONDS AND INITIALIZE INTENT
        int time=Integer.parseInt(timeTxt.getText().toString());
        Intent i=new Intent(this,MyReceiver.class);

        //PASS CONTEXT,YOUR PRIVATE REQUEST CODE,INTENT OBJECT AND FLAG
        PendingIntent pi=PendingIntent.getBroadcast(this,0,i,0);

        //INITIALIZE ALARM MANAGER
        AlarmManager alarmManager= (AlarmManager) getSystemService(ALARM_SERVICE);

        //SET THE ALARM
        alarmManager.set(AlarmManager.RTC_WAKEUP, System.currentTimeMillis()+(time*1000),pi);
        Toast.makeText(MainActivity.this, "Alarm set in "+time+" seconds", Toast.LENGTH_SHORT).show();
    }

}

ActivityMain.xml

  • Modèle de mise en page.
  • Contient notre ContentMain.xml.
  • Définit également le appbarlayout, la barre d'outils ainsi que le buttton d'action flottante.

<?xml version="1.0" encoding="utf-8"?>
<android.support.design.widget.CoordinatorLayout

    android_layout_width="match_parent"
    android_layout_height="match_parent"
    android_fitsSystemWindows="true"
    tools_context="com.tutorials.hp.alarmmanagerstarter.MainActivity">

    <android.support.design.widget.AppBarLayout
        android_layout_width="match_parent"
        android_layout_height="wrap_content"
        android_theme="@style/AppTheme.AppBarOverlay">

        <android.support.v7.widget.Toolbar
            android_id="@+id/toolbar"
            android_layout_width="match_parent"
            android_layout_height="?attr/actionBarSize"
            android_background="?attr/colorPrimary"
            app_popupTheme="@style/AppTheme.PopupOverlay" />

    </android.support.design.widget.AppBarLayout>

    <include layout="@layout/content_main" />

    <android.support.design.widget.FloatingActionButton
        android_id="@+id/fab"
        android_layout_width="wrap_content"
        android_layout_height="wrap_content"
        android_layout_gravity="bottom|end"
        android_layout_margin="@dimen/fab_margin"
        android_src="@android:drawable/ic_dialog_email" />

</android.support.design.widget.CoordinatorLayout>

ContentMain.xml

  • Content Layout.
  • Définit les vues et les widgets à afficher à l'intérieur de la MainActivity.

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout

    android_layout_width="match_parent"
    android_layout_height="match_parent"
    android_paddingBottom="@dimen/activity_vertical_margin"
    android_paddingLeft="@dimen/activity_horizontal_margin"
    android_paddingRight="@dimen/activity_horizontal_margin"
    android_paddingTop="@dimen/activity_vertical_margin"
    app_layout_behavior="@string/appbar_scrolling_view_behavior"
    tools_context="com.tutorials.hp.alarmmanagerstarter.MainActivity"
    tools_showIn="@layout/activity_main">

    <EditText
        android_id="@+id/timeTxt"
        android_layout_width="wrap_content"
        android_layout_height="wrap_content"
        android_layout_alignParentLeft="true"
        android_layout_alignParentTop="true"
        android_layout_marginTop="28dp"
        android_ems="10"
        android_hint="Number of seconds"
        android_inputType="numberDecimal" />

    <Button
        android_id="@+id/startBtn"
        android_layout_width="wrap_content"
        android_layout_height="wrap_content"
        android_layout_alignRight="@+id/timeTxt"
        android_layout_below="@+id/timeTxt"
        android_layout_marginRight="60dp"
        android_layout_marginTop="120dp"
        android_text="Start" />
</RelativeLayout>

How To Run

  1. Téléchargez le projet ci-dessus.
  2. Vous obtiendrez un fichier zippé, extrayez-le.
  3. Ouvrez le Android Studio.
  4. Fermez maintenant le projet déjà ouvert.
  5. Dans la barre de menu, cliquez sur File >New> Import Project.
  6. Choisissez maintenant un dossier de destination, à partir duquel vous voulez importer le projet.
  7. Choisissez un projet Android.
  8. Cliquez maintenant sur "OK".
  9. Terminé, vous avez fini d'importer le projet, maintenant éditez-le.

Conclusion.

Nous avons vu un exemple simple d'android AlarmManager.

Exemple : Programmation Android d'alarmes répétitives/récurrentes

AlarmManager existe depuis le début d'Android. Il nous permet de planifier des tâches à effectuer dans le futur.

Avec AlarmManager, vous pouvez définir un code qui sera exécuté dans le futur.

AlarmManager appartient au paquet "android.app" et hérite de "java.lang.Object". Même lorsque l'appareil est endormi, les alarmes sont conservées tant qu'elles ont été enregistrées. Dans cet exemple, nous allons voir comment travailler avec des alarmes récurrentes/répétitives.

Nous allons programmer l'affichage de messages Toast après un nombre donné de secondes. Par exemple, si l'utilisateur entre 5 dans le champ edittexts et clique sur le bouton start, le message Toast sera affiché toutes les 5 secondes jusqu'à ce que l'utilisateur clique sur le bouton cancel pour annuler les alarmes. Nous avons donc vu comment lancer des alarmes répétitives et les annuler. Vous pouvez trouver plus de détails sur AlarmManager ici.

Questions communes à cet exemple

  • Comment utiliser le AlarmManager d'android ?
  • Comment définir des alarmes répétées/récurrentes dans android et les annuler.
  • Démarrer et annuler des alarmes en android.
  • Comment programmer un travail à faire dans le futur en android ?
  • Exemple facile de AlarmManager récurrent avec un Toast.

Outils utilisés

Cet exemple a été écrit avec les outils suivants :

  • Windows 8
  • IDE AndroidStudio
  • Emulateur Genymotion
  • Langue : Java
  • Sujet : Alarmes récurrentes Android, AlarmManager, Démarrer Annuler Répéter Alarmes

Bibliothèques utilisées

  • Nous n'utilisons pas de bibliothèque tierce.

Code source

Passons directement au code source.

Build.Gradle

Normalement dans les projets android, il y a deux fichiers build.gradle. L'un est le niveau application build.gradle, l'autre est le niveau projet build.gradle. Le niveau "app" se trouve dans le dossier "app" et c'est là que nous ajoutons normalement nos dépendances et que nous spécifions les sdks de compilation et de destination.

Ajoutez également les dépendances pour les bibliothèques AppCompat et Design support.
Notre MainActivity dérivera de AppCompatActivity tandis que nous utiliserons également FloatingActionButton des bibliothèques de support de conception.

apply plugin: 'com.android.application'

android {
    compileSdkVersion 26
    buildToolsVersion "26.0.0"
    defaultConfig {
        applicationId "com.tutorials.hp.repeatingalarm"
        minSdkVersion 15
        targetSdkVersion 26
        versionCode 1
        versionName "1.0"
        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
}

dependencies {
    implementation fileTree(dir: 'libs', include: ['*.jar'])
    androidtestImplementation('com.android.support.test.espresso:espresso-core:2.2.2', {
        exclude group: 'com.android.support', module: 'support-annotations'
    })
    implementation 'com.android.support:appcompat-v7:26.+'
    implementation 'com.android.support.constraint:constraint-layout:1.0.0-alpha7'
    implementation 'com.android.support:design:26.+'
    testImplementation 'junit:junit:4.12'
}

MyReceiver.java

  • Notre classe MyReceiver.
  • Dérive de android.content.BroadcastReceiver.
  • Nous surchargeons la méthode onReceive() et effectuons la tâche à faire lorsque l'alarme sonne ici.

package com.tutorials.hp.repeatingalarm;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.widget.Toast;

public class MyReceiver extends BroadcastReceiver {
    /*
   RING ALARM WHEN IN WHEN WE RECEIVE OUR BROADCAST
    */
    @Override
    public void onReceive(Context context, Intent intent) {
        Toast.makeText(context, "Alarm Ringing...", Toast.LENGTH_SHORT).show();
    }
}

MainActivity.java

  • Notre classe MainActivity.
  • Dérive de AppCompatActivity qui est une classe de base pour les activités qui utilisent les caractéristiques de la barre d'action de la bibliothèque de support.
  • Méthodes : onCreate(), initializeViews(), initializeAlarmManager(), go().
  • Gonflé à partir de activity_main.xml en utilisant la méthode setContentView().
  • Les vues que nous utilisons sont EditTexts et buttons.
  • Référencez-les à partir de notre spécification de mise en page en utilisant findViewById().
  • Initialisez AlarmManager.
  • Démarrez l'alarme en utilisant la fonction setInExactRepeating().

package com.tutorials.hp.repeatingalarm;

import android.app.AlarmManager;
import android.app.PendingIntent;
import android.content.Intent;
import android.os.Build;
import android.os.Bundle;
import android.support.design.widget.FloatingActionButton;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.Toolbar;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;

public class MainActivity extends AppCompatActivity {

    Button startBtn,cancelBtn;
    EditText timeTxt;
    AlarmManager alarmManager;
    PendingIntent pi;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);

     initializeViews();
     initializeAlarmManager();

        FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab);
        fab.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                go();
            }
        });

    }

    /*
    INITIALIZE VIEWS
     */
    private void initializeViews()
    {
        timeTxt= (EditText) findViewById(R.id.timeTxt);
        startBtn= (Button) findViewById(R.id.startBtn);
        cancelBtn= (Button) findViewById(R.id.cancelBtn);

        startBtn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                go();
            }
        });
        cancelBtn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                if(alarmManager != null)
                {
                    alarmManager.cancel(pi);
                }
            }
        });
    }
  /*
  INITIALIZE AND START OUR ALARM
  */
  private void initializeAlarmManager()
  {
    // INITIALIZE INTENT
    Intent intent=new Intent(this,MyReceiver.class);

        //PASS CONTEXT,YOUR PRIVATE REQUEST CODE,INTENT OBJECT AND FLAG
        pi= PendingIntent.getBroadcast(this,0,intent,0);

        //INITIALIZE ALARM MANAGER
        alarmManager= (AlarmManager) this.getSystemService(ALARM_SERVICE);
  }

    /*
    START OUR ALARM
     */
    private void go()
    {
        //GET TIME IN SECONDS
        int time=Integer.parseInt(timeTxt.getText().toString());

        //SET THE ALARM
       if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.CUPCAKE) {
            alarmManager.setInexactRepeating(AlarmManager.RTC_WAKEUP,System.currentTimeMillis()+(time*1000),time*1000,pi);
            Toast.makeText(MainActivity.this, "Alarm set in "+time+" seconds", Toast.LENGTH_SHORT).show();

        }else
        {
            alarmManager.setRepeating(AlarmManager.ELAPSED_REALTIME,System.currentTimeMillis()+(time*1000),time*1000,pi);
            Toast.makeText(MainActivity.this, "Yes Alarm set in "+time+" seconds", Toast.LENGTH_SHORT).show();

        }
    }

}

ActivityMain.xml

Il s'agit d'un modèle de mise en page pour notre MainActivity. Notre balise Root layout est CoordinatorLayout. CoordinatorLayout est un groupe de vues qui est un superpowered sur framelayout.

  • Le CoordinatorLayout est destiné à deux cas d'utilisation principaux : Comme un décor d'application de haut niveau ou une mise en page de chrome Comme un conteneur pour une interaction spécifique avec une ou plusieurs vues enfant.
  • Dans notre CoordinatorLayout, nous ajoutons : AppBarLayout, FloatingActionButton et incluons content_main.xml.
  • AppBarLayout est un LinearLayout vertical qui implémente les fonctionnalités de défilement du concept de material design.
  • Il doit être un enfant direct de CoordinatorLayout, sinon beaucoup de fonctionnalités ne fonctionneront pas.
  • A l'intérieur du AppBarLayout, nous ajoutons notre toolbar, à laquelle nous donnons une couleur bleue.
  • Nous ajouterons nos widgets dans notre fichier content_main.xml, et non ici car il s'agit d'un modèle de layout.
  • Enfin, nous avons un FloatingActionButton, une classe qui dérive de android.support.design.widget.VisibilityAwareImageButton. C'est le bouton rond que vous voyez dans notre interface utilisateur.

<?xml version="1.0" encoding="utf-8"?>

<android.support.design.widget.CoordinatorLayout

    android_layout_width="match_parent"
    android_layout_height="match_parent"
    tools_context="com.tutorials.hp.repeatingalarm.MainActivity">

    <android.support.design.widget.AppBarLayout
        android_layout_width="match_parent"
        android_layout_height="wrap_content"
        android_theme="@style/AppTheme.AppBarOverlay">

        <android.support.v7.widget.Toolbar
            android_id="@+id/toolbar"
            android_layout_width="match_parent"
            android_layout_height="?attr/actionBarSize"
            android_background="?attr/colorPrimary"
            app_popupTheme="@style/AppTheme.PopupOverlay" />

    </android.support.design.widget.AppBarLayout>

    <include layout="@layout/content_main" />

    <android.support.design.widget.FloatingActionButton
        android_id="@+id/fab"
        android_layout_width="wrap_content"
        android_layout_height="wrap_content"
        android_layout_gravity="bottom|end"
        android_layout_margin="@dimen/fab_margin"
        app_srcCompat="@android:drawable/ic_dialog_email" />

</android.support.design.widget.CoordinatorLayout>

ContentMain.xml

  • Notre fichier ContentMain.xml.
  • Doit être gonflé en MainActivity.
  • La balise racine est ConstraintLayout.
  • Contient EditTexts et deux boutons.
  • L'utilisateur saisira le nombre de secondes après lequel l'alarme sonnera dans le texte d'édition.
  • Puis il clique sur le bouton Start pour lancer l'alarme.
  • Et le bouton Annuler pour annuler l'alarme.

<?xml version="1.0" encoding="utf-8"?>

<android.support.constraint.ConstraintLayout

    android_layout_width="match_parent"
    android_layout_height="match_parent"
    app_layout_behavior="@string/appbar_scrolling_view_behavior"
    tools_context="com.tutorials.hp.repeatingalarm.MainActivity"
    tools_showIn="@layout/activity_main">

    <LinearLayout
        android_layout_width="368dp"
        android_layout_height="327dp"
        android_orientation="vertical"
        app_layout_constraintTop_toTopOf="parent"
        android_layout_marginTop="8dp">
        <EditText
            android_id="@+id/timeTxt"
            android_layout_width="wrap_content"
            android_layout_height="wrap_content"
            android_layout_alignParentLeft="true"
            android_layout_alignParentTop="true"
            android_ems="10"
            android_hint="Number of seconds"
            android_inputType="numberDecimal"
            />

        <Button
            android_id="@+id/startBtn"
            android_layout_width="match_parent"
            android_layout_height="wrap_content"
            android_layout_alignRight="@+id/timeTxt"
            android_layout_below="@+id/timeTxt"
            android_text="Start"
            />
        <Button
            android_id="@+id/cancelBtn"
            android_layout_width="match_parent"
            android_layout_height="wrap_content"
            android_layout_alignRight="@+id/timeTxt"
            android_layout_below="@+id/timeTxt"
            android_text="Cancel"
            />

    </LinearLayout>

</android.support.constraint.ConstraintLayout>

Vidéo/Préview

  • Nous avons une chaîne YouTube avec presque un millier de tutoriels, celui ci-dessous étant l'un d'entre eux.

https://www.youtube.com/watch?v=23Gw-11JFqc

Téléchargement

  • Vous pouvez télécharger le projet complet ci-dessous. Le code source est bien commenté.

Télécharger

Catégorisé: