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
comme suit :MainActivity
. Ajoutez simplement des TextViews et des boutons et contraignez-les en utilisant le
ConstraintLayout
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
comme ci-dessous :MainActivity
**
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.
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 unToast
.
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 applicationbuild.gradle
, l'autre est le niveau projetbuild.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 deAppCompatActivity
tandis que nous utiliserons égalementFloatingActionButton
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
- Téléchargez le projet ci-dessus.
- Vous obtiendrez un fichier zippé, extrayez-le.
- Ouvrez le Android Studio.
- Fermez maintenant le projet déjà ouvert.
- Dans la barre de menu, cliquez sur File >New> Import Project.
- Choisissez maintenant un dossier de destination, à partir duquel vous voulez importer le projet.
- Choisissez un projet Android.
- Cliquez maintenant sur "OK".
- 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 unToast
.
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éthodesetContentView()
. - Les vues que nous utilisons sont
EditTexts
etbuttons
. - 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 incluonscontent_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 notretoolbar
, à 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 deandroid.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é.