384 votes

Exemple de gestionnaire d'alarme

Je veux implémenter une fonction de planification dans mon projet. J'ai donc cherché sur Google un programme de gestion des alarmes mais je n'ai pas trouvé d'exemples.

Quelqu'un peut-il m'aider à trouver un programme basique de gestion des alarmes ?

13 votes

Vous avez vérifié les démos de l'API, n'est-ce pas ?

3 votes

lien ce lien fonctionne pour la 4.0 testée

476voto

Zaur Points 3277

Ce code fonctionne. Il réveille le CPU toutes les 10 minutes jusqu'à ce que le téléphone s'éteigne.

Ajouter à Manifest.xml :

...
<uses-permission android:name="android.permission.WAKE_LOCK"></uses-permission>
...
<receiver  android:process=":remote" android:name="Alarm"></receiver>
...

Code :

    package YourPackage;
    import android.app.AlarmManager;
    import android.app.PendingIntent;
    import android.content.BroadcastReceiver;
    import android.content.Context;
    import android.content.Intent;
    import android.os.PowerManager;
    import android.widget.Toast;

    public class Alarm extends BroadcastReceiver 
    {    
         @Override
         public void onReceive(Context context, Intent intent) 
         {   
             PowerManager pm = (PowerManager) context.getSystemService(Context.POWER_SERVICE);
             PowerManager.WakeLock wl = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "");
             wl.acquire();

             // Put here YOUR code.
             Toast.makeText(context, "Alarm !!!!!!!!!!", Toast.LENGTH_LONG).show(); // For example

             wl.release();
         }

     public void SetAlarm(Context context)
     {
         AlarmManager am=(AlarmManager)context.getSystemService(Context.ALARM_SERVICE);
         Intent i = new Intent(context, Alarm.class);
         PendingIntent pi = PendingIntent.getBroadcast(context, 0, i, 0);
         am.setRepeating(AlarmManager.RTC_WAKEUP, System.currentTimeMillis(), 1000 * 60 * 10, pi); // Millisec * Second * Minute
     }

     public void CancelAlarm(Context context)
     {
         Intent intent = new Intent(context, Alarm.class);
         PendingIntent sender = PendingIntent.getBroadcast(context, 0, intent, 0);
         AlarmManager alarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
         alarmManager.cancel(sender);
     }
 }

Régler l'alarme à partir du service :

package YourPackage;
import android.app.Service;
import android.content.Context;
import android.content.Intent;
import android.os.IBinder;

public class YourService extends Service
{
    Alarm alarm = new Alarm();
    public void onCreate()
    {
        super.onCreate();       
    }

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) 
{
         alarm.SetAlarm(YourService.this);
     return START_STICKY;
}

    public void onStart(Context context,Intent intent, int startId)
    {
        alarm.SetAlarm(context);
    }

    @Override
    public IBinder onBind(Intent intent) 
    {
        return null;
    }
}

Si vous voulez que l'alarme se répète au moment du démarrage du téléphone :

Ajouter la permission à Manifest.xml :

<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"></uses-permission>
...
<receiver android:name=".AutoStart">
    <intent-filter>
        <action android:name="android.intent.action.BOOT_COMPLETED"></action>
    </intent-filter>
</receiver>
...

Et créer une nouvelle classe :

package YourPackage;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;

public class AutoStart extends BroadcastReceiver
{   
    Alarm alarm = new Alarm();
    @Override
    public void onReceive(Context context, Intent intent)
    {   
        if (intent.getAction().equals("android.intent.action.BOOT_COMPLETED"))
        {
            alarm.SetAlarm(context);
        }
    }
}

7 votes

Comment cette méthode setAlarm sera appelée. Si je veux l'appeler depuis la classe de service ? Est-elle appelée automatiquement ?

1 votes

Alarm.StartAlarm(context) ; qu'est-ce que le contexte et comment l'initialiser ?

1 votes

Le maintien du verrouillage de la veille est-il nécessaire dans ce cas ? La documentation indique que "le gestionnaire d'alarme maintient un verrou de réveil du CPU tant que la méthode onReceive() du récepteur d'alarme est exécutée".

61voto

AndroidDev Points 3110

J'ai essayé la solution de XXX et, bien qu'elle ait fonctionné au début, elle a cessé de fonctionner à un moment donné. Le onReceive n'a plus jamais été appelé. J'ai passé des heures à essayer de comprendre ce que cela pouvait être. Je me suis rendu compte que, pour une raison mystérieuse, l'Intent n'était plus appelé. Pour contourner ce problème, j'ai découvert que vous devez vraiment spécifier une action pour le récepteur dans le manifeste. Exemple :

<receiver android:name=".Alarm" android:exported="true">
    <intent-filter>
        <action android:name="mypackage.START_ALARM" >
        </action>
    </intent-filter>
</receiver> 

Notez que le nom est ".Alarm" avec le point. Dans la méthode SetAlarm de XXX, créez l'Intent comme suit :

Intent i = new Intent("mypackage.START_ALARM");

Le message START_ALARM peut être ce que vous voulez. Je lui ai simplement donné ce nom à des fins de démonstration.

Je n'ai pas vu de récepteurs définis dans le manifeste sans un filtre d'intention qui spécifie l'action. Les créer de la manière dont XXX l'a spécifié semble un peu bidon. En spécifiant le nom de l'action, Android sera obligé de créer une instance du BroadcastReceiver en utilisant la classe qui correspond à l'action. Si vous comptez sur le contexte, sachez qu'Android a plusieurs objets différents qui sont TOUS appelés contexte et qui peuvent ne pas aboutir à la création de votre BroadcastReceiver. Forcer Android à créer une instance de votre classe en utilisant uniquement le message de l'action est bien mieux que de se fier à un contexte douteux qui pourrait ne jamais fonctionner.

2 votes

@AndroidDev Selon PendingIntent.getBroadcast documentation, For security reasons, the Intent you supply here should almost always be an explicit intent, that is specify an explicit component to be delivered to through Intent.setClass .

2 votes

Peu importe ce que dit la documentation, cela devrait être la réponse acceptée parce que cela fonctionne en fait contrairement à la réponse acceptée.

0 votes

Confirmé - pour moi, les alarmes ne se déclencheraient pas sans l'intention.

28voto

amr Points 354

Voici un exemple assez complet. Il fait passer un bouton au rouge après 5 secondes.

    public void SetAlarm()
    {
        final Button button = buttons[2]; // replace with a button from your own UI
        BroadcastReceiver receiver = new BroadcastReceiver() {
            @Override public void onReceive( Context context, Intent _ )
            {
                button.setBackgroundColor( Color.RED );
                context.unregisterReceiver( this ); // this == BroadcastReceiver, not Activity
            }
        };

        this.registerReceiver( receiver, new IntentFilter("com.blah.blah.somemessage") );

        PendingIntent pintent = PendingIntent.getBroadcast( this, 0, new Intent("com.blah.blah.somemessage"), 0 );
        AlarmManager manager = (AlarmManager)(this.getSystemService( Context.ALARM_SERVICE ));

        // set alarm to fire 5 sec (1000*5) from now (SystemClock.elapsedRealtime())
        manager.set( AlarmManager.ELAPSED_REALTIME_WAKEUP, SystemClock.elapsedRealtime() + 1000*5, pintent );
    }

Rappelez-vous cependant que le AlarmManager se déclenche même lorsque votre application n'est pas en cours d'exécution. Si vous appelez cette fonction et appuyez sur le bouton Home, attendez 5 secondes, puis retournez dans votre application, le bouton sera devenu rouge.

Je ne sais pas quel type de comportement vous obtiendriez si votre application n'est pas du tout en mémoire, alors faites attention au type d'état que vous essayez de préserver.

17 votes

Vous devriez poster tout le code de la classe pour voir les imports et extends nécessaires

0 votes

Comment faire pour que cela soit répété toutes les 24 heures ?

1 votes

Ce code exécute la méthode onReceive exactement une fois, puis plus jamais.

18voto

shareef Points 1482

vous pouvez voir cet exemple son rappel avec la fonction de répétition lien ce lien fonctionne pour la 4.0 testée

enter image description here

2voto

Jose Kurian Points 84

Ce code vous aidera à faire une alarme répétitive. Le temps de répétition peut être réglé par vous.

activité_main.xml

     <?xml version="1.0" encoding="utf-8"?>
     <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:tools="http://schemas.android.com/tools"
     android:layout_width="match_parent"
     android:layout_height="match_parent"
     android:orientation="vertical" 
     android:background="#000000"
     android:paddingTop="100dp">

    <LinearLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:gravity="center" >

    <EditText
        android:id="@+id/ethr"
    android:layout_width="50dp"
    android:layout_height="wrap_content"
    android:ems="10"
    android:hint="Hr"
    android:singleLine="true" >

        <requestFocus />
    </EditText>

    <EditText
        android:id="@+id/etmin"
    android:layout_width="55dp"
    android:layout_height="wrap_content"

    android:ems="10"
    android:hint="Min"
    android:singleLine="true" />

    <EditText
        android:id="@+id/etsec"
    android:layout_width="50dp"
    android:layout_height="wrap_content"

    android:ems="10"
    android:hint="Sec"
    android:singleLine="true" />

    </LinearLayout>

   <LinearLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content" 
    android:gravity="center"
    android:paddingTop="10dp">

    <Button
        android:id="@+id/setAlarm"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:onClick="onClickSetAlarm"
        android:text="Set Alarm" />

</LinearLayout>

</LinearLayout>

` MainActivity.java

public class MainActivity extends Activity
{

PendingIntent pendingIntent;
AlarmManager alarmManager;
BroadcastReceiver mReceiver;
EditText ethr,etmin,etsec;
int result = 1;
int hr = 0;
int min = 0;
int sec = 0;
@Override
protected void onCreate(Bundle savedInstanceState)
{
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    ethr = (EditText) findViewById(R.id.ethr);
    etmin = (EditText) findViewById(R.id.etmin);
    etsec = (EditText) findViewById(R.id.etsec);

    RegisterAlarmBroadcast();
}
public void onClickSetAlarm(View v)
{
    String shr = ethr.getText().toString();
    if(shr.equals(""))
    {
        hr = 0;
    }
    else
    {
        hr = Integer.parseInt(ethr.getText().toString());
        hr=hr*60*60*1000;
    }

    String smin = etmin.getText().toString();
    if(smin.equals(""))
    {
        min = 0;
    }
    else
    {
         min = Integer.parseInt(etmin.getText().toString());
         min = min*60*1000;

    }

    String ssec = etsec.getText().toString();
    if(ssec.equals(""))
    {
        sec = 0;
    }
    else
    {
         sec = Integer.parseInt(etsec.getText().toString());
         sec = sec * 1000;

    }

    result = hr+min+sec;

    alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, System.currentTimeMillis(), result , pendingIntent); 
}
private void RegisterAlarmBroadcast()
{       
    mReceiver = new BroadcastReceiver()
    {
       // private static final String TAG = "Alarm Example Receiver";
        @Override
        public void onReceive(Context context, Intent intent)
        {
            Toast.makeText(context, "Alarm time has been reached", Toast.LENGTH_LONG).show();
        }
    };

    registerReceiver(mReceiver, new IntentFilter("sample") );
    pendingIntent = PendingIntent.getBroadcast( this, 0, new Intent("sample"),0 );
    alarmManager = (AlarmManager)(this.getSystemService( Context.ALARM_SERVICE ));
}
private void UnregisterAlarmBroadcast()
{
    alarmManager.cancel(pendingIntent); 
    getBaseContext().unregisterReceiver(mReceiver);
}

@Override
public boolean onCreateOptionsMenu(Menu menu) 
{
    getMenuInflater().inflate(R.menu.main, menu);
    return true;
}
@Override
protected void onDestroy() 
{
    unregisterReceiver(mReceiver);
    super.onDestroy();
  }
 }

Si vous n'avez besoin de l'alarme que pour une seule fois, remplacez-la.

alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, System.currentTimeMillis(), result , pendingIntent);

avec

 alarmManager.set( AlarmManager.RTC_WAKEUP, System.currentTimeMillis() + result , pendingIntent );

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X