web-dev-qa-db-fra.com

Démarrer l'application à un moment précis

Je me demandais s'il est possible (et si c'est comment) de démarrer mon application à une heure précise, quelque chose comme un réveil qui se déclenche à une heure précise. Disons que je veux que mon application démarre à 8 heures du matin, est-ce faisable?

24
TiGer

Vous pouvez le faire avec AlarmManager, voici un court exemple. Vous devez d'abord régler l'alarme:

AlarmManager am = (AlarmManager) con.getSystemService(Context.ALARM_SERVICE);

Date futureDate = new Date(new Date().getTime() + 86400000);
futureDate.setHours(8);
futureDate.setMinutes(0);
futureDate.setSeconds(0);
Intent intent = new Intent(con, MyAppReciever.class);

PendingIntent sender = PendingIntent.getBroadcast(con, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);
am.set(AlarmManager.RTC_WAKEUP, futureDate.getTimeInMillis(), sender); 

Ensuite, vous devez créer un récepteur avec du code pour exécuter votre application: (c'est-à-dire démarrer votre application):

public class MyAppReciever extends BroadcastReceiver {

@Override
public void onReceive(Context context, Intent intent) {

    startActivity(new Intent(context, MyAppMainActivity.class));
   }
}
20
ninjasense

Vous recherchez probablement AlarmManager , qui vous permet de démarrer des services/activités/d'envoyer des diffusions à des intervalles spécifiques ou à une heure donnée, en répétant ou non. C'est ainsi que vous écrivez des services d'arrière-plan compatibles avec la mémoire dans Android. AlarmManager est un peu comme cron sous unix. Il permet à votre service d'arrière-plan de démarrer, de faire son travail et de perdre de la mémoire.

Vous ne voulez probablement pas démarrer une activité (si c'est ce que vous vouliez dire par "application"). Si vous souhaitez alerter l'utilisateur que quelque chose s'est produit, ajoutez une alarme qui démarre un récepteur à une heure donnée et demandez au récepteur d'ajouter une notification. La notification peut ouvrir l'application lorsque vous cliquez dessus. C'est moins invasif que de mettre au premier plan une activité potentiellement indésirable.

11
Jeffrey Blattman

il y a un très bon tutoriel: http://www.javacodegeeks.com/2012/09/Android-alarmmanager-tutorial.html

voici le c & p:

Tutoriel Android AlarmManager par Rakesh Cusat le 20 septembre 2012 | Classé dans: Android Core

Lors de l'écriture d'une application, il est nécessaire de planifier l'exécution du code à l'avenir. Vous pouvez demander à AlarmManager de planifier votre travail à une heure spécifiée. AlarmManager accède à l'alarme système et planifie l'exécution du code même lorsque l'application n'est pas en cours d'exécution. Informations sur le projet: méta-informations sur le projet. Version de la plateforme: Android API Level 10. IDE: émulateur Eclipse Helios Service Release 2: Android 4.1

Prérequis: Connaissance préliminaire de Android framework d'application et récepteur Intent Broadcast.

AlarmManager:

AlarmManager a accès aux services d'alarme du système. Avec l'aide d'AlarmManager, vous pouvez planifier l'exécution du code à l'avenir. L'objet AlarmManager ne peut pas instancier directement mais il peut être récupéré en appelant Context.getSystemService (Context.ALARM_SERVICE). AlarmManager est toujours enregistré avec intention. Lorsqu'une alarme se déclenche, l'intention qui a été enregistrée avec AlarmManager est diffusée automatiquement par le système. Cette intention démarre l'application cible si elle n'est pas en cours d'exécution. Il est recommandé d'utiliser AlarmManager lorsque vous souhaitez que votre code d'application s'exécute à un moment précis, même si votre application n'est pas en cours d'exécution. Pour d'autres opérations de chronométrage, un gestionnaire doit être utilisé car il est facile à utiliser. Le gestionnaire est traité dans d'autres didacticiels.

Méthode Description set () Planifie une alarme pour une fois. setInexactRepeating () Planifie une alarme avec répétition inexacte. Le temps de déclenchement ne suit aucune restriction stricte. setRepeating () Planifie une alarme avec un temps de répétition exact. setTime () Définit l'heure de l'horloge murale du système. setTimeZone () Définit le fuseau horaire par défaut du système. Consultez la documentation AlarmManager pour plus d'informations.

Dans ce didacticiel, apprenons à créer un minuteur unique et un minuteur répétitif, ainsi que d'annuler le minuteur répétitif. Ici, la minuterie et l'alarme ont été utilisées de manière interchangeable, mais dans ce contexte de tutoriel, les deux ont la même signification.

Exemple de code:

Créons trois boutons pour démarrer la minuterie répétitive, annuler la minuterie répétitive et la minuterie unique dans le fichier de mise en page. Ces boutons sont attachés avec des méthodes à savoir startRepeatingTimer, cancelRepeatingTimer et onetimeTimer respectivement. Ces méthodes seront définies dans la classe Activity. Le fichier de mise en page est illustré ci-dessous (activity_alarm_manager.xml).

<linearlayout Android:layout_height='match_parent' 
   Android:layout_width='match_parent' Android:orientation='vertical' 
   xmlns:Android='http://schemas.Android.com/apk/res/Android' 
   xmlns:tools='http://schemas.Android.com/tools'>

   <button Android:id='@+id/btStart' Android:layout_height='wrap_content' 
     Android:layout_width='match_parent' Android:onclick='startRepeatingTimer' 
     Android:padding='@dimen/padding_medium' Android:text='@string/btStart'   
     tools:context='.WidgetAlarmManagerActivity'/>
   <button Android:id='@+id/btCancel' Android:layout_height='wrap_content' 
     Android:layout_width='match_parent' Android:onclick='cancelRepeatingTimer'  
     Android:padding='@dimen/padding_medium' Android:text='@string/btCancel' 
     tools:context='.WidgetAlarmManagerActivity'/>
    <button Android:id='@+id/btOneTime' Android:layout_height='wrap_content' 
    Android:layout_width='match_parent' Android:onclick='onetimeTimer' 
    Android:padding='@dimen/padding_medium' Android:text='@string/btOneTime'   
    tools:context='.WidgetAlarmManagerActivity'/>
  </linearlayout>

Nous allons définir le BroadcastReciever qui gère l'intention enregistrée avec AlarmManager. Dans la classe donnée, la méthode onReceive () a été définie. Cette méthode est invoquée dès que l'intention est reçue. Une fois que nous recevons l'intention, nous essayons d'obtenir le paramètre supplémentaire associé à cette intention. Ce paramètre supplémentaire est défini par l'utilisateur, c'est-à-dire ONE_TIME, indique essentiellement si cette intention a été associée à un temporisateur unique ou répétitif. Une fois la valeur du paramètre ONE_TIME extraite, le message Toast s'affiche en conséquence. Des méthodes d'assistance ont également été définies, qui peuvent être utilisées à d'autres endroits à l'aide d'objets, à savoir les méthodes setAlarm (), cancelAlarm () et onetimeTimer (). Ces méthodes peuvent également être définies ailleurs pour effectuer des opérations sur la minuterie, c'est-à-dire régler, annuler, etc. Pour garder ce tutoriel simple, nous l'avons défini dans BroadcastReceiver.

setAlarm (): Cette méthode définit l'alarme répétitive en utilisant la méthode setRepeating (). La méthode setRepeating () a besoin de quatre arguments:

type d'alarme, heure de déclenchement: réglez-le sur l'intervalle de temps actuel en millisecondes: dans cet exemple, nous passons 5 secondes (1000 * 5 millisecondes) en attente d'intention: il sera enregistré avec cette alarme. Lorsque l'alarme se déclenche, l'Intente en attente est diffusée. cancelAlarm (): Cette méthode annule l'alarme précédemment enregistrée en appelant la méthode cancel (). La méthode cancel () prend en attente pendingIntent comme argument. Le pendingIntent doit correspondre à un, seulement alors la méthode cancel () peut supprimer l'alarme du système.

onetimeTimer (): cette méthode crée une alarme unique. Ceci peut être réalisé en appelant la méthode set (). La méthode set () prend trois arguments:

type de temps de déclenchement d'alarme en attente d'intention

package com.rakesh.alarmmanagerexample;

import Java.text.Format;
import Java.text.SimpleDateFormat;
import Java.util.Date;

import Android.app.AlarmManager;
import Android.app.PendingIntent;
import Android.content.BroadcastReceiver;
import Android.content.Context;
import Android.content.Intent;
import Android.os.Bundle;
import Android.os.PowerManager;
import Android.widget.Toast;

public class AlarmManagerBroadcastReceiver extends BroadcastReceiver {

 final public static String ONE_TIME = 'onetime';

 @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, 'YOUR TAG');
         //Acquire the lock
         wl.acquire();

         //You can do the processing here.
         Bundle extras = intent.getExtras();
         StringBuilder msgStr = new StringBuilder();

         if(extras != null && extras.getBoolean(ONE_TIME, Boolean.FALSE)){
          //Make sure this intent has been sent by the one-time timer button.
          msgStr.append('One time Timer : ');
         }
         Format formatter = new SimpleDateFormat('hh:mm:ss a');
         msgStr.append(formatter.format(new Date()));

         Toast.makeText(context, msgStr, Toast.LENGTH_LONG).show();

         //Release the lock
         wl.release();
 }

 public void SetAlarm(Context context)
    {
        AlarmManager am=(AlarmManager)context.getSystemService(Context.ALARM_SERVICE);
        Intent intent = new Intent(context, AlarmManagerBroadcastReceiver.class);
        intent.putExtra(ONE_TIME, Boolean.FALSE);
        PendingIntent pi = PendingIntent.getBroadcast(context, 0, intent, 0);
        //After after 5 seconds
        am.setRepeating(AlarmManager.RTC_WAKEUP, System.currentTimeMillis(), 1000 * 5 , pi); 
    }

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

    public void setOnetimeTimer(Context context){
     AlarmManager am=(AlarmManager)context.getSystemService(Context.ALARM_SERVICE);
        Intent intent = new Intent(context, AlarmManagerBroadcastReceiver.class);
        intent.putExtra(ONE_TIME, Boolean.TRUE);
        PendingIntent pi = PendingIntent.getBroadcast(context, 0, intent, 0);
        am.set(AlarmManager.RTC_WAKEUP, System.currentTimeMillis(), pi);
    }
}

Ci-dessous se trouve le fichier manifeste. Ici, l'autorisation WAKE_LOCK est requise car le verrou de réveil est utilisé lors du traitement dans la méthode onReceive () présente dans la classe AlarmManagerBroadcastReceiver. AlarmManagerBroadcastReceiver a été enregistré comme récepteur de diffusion.

<manifest Android:versioncode='1' Android:versionname='1.0' 
       package='com.rakesh.alarmmanagerexample' 
       xmlns:Android='http://schemas.Android.com/apk/res/Android'>

   <uses-sdk Android:minsdkversion='10' Android:targetsdkversion='15'/>
   <uses-permission Android:name='Android.permission.WAKE_LOCK'/>
    <application Android:icon='@drawable/ic_launcher' 
       Android:label='@string/app_name' Android:theme='@style/AppTheme'>
        <activity Android:label='@string/title_activity_alarm_manager' 
           Android:name='com.rakesh.alarmmanagerexample.AlarmManagerActivity'>
            <intent-filter>
                <action Android:name='Android.intent.action.MAIN'/>
                <category Android:name='Android.intent.category.LAUNCHER' />
          </intent-filter>
        </activity>
        <receiver Android:name='com.rakesh.alarmmanagerexample.AlarmManagerBroadcastReceiver'>
        </receiver>
    </application>
</manifest>

Définissons maintenant la classe d'activité qui définit certaines méthodes. Ces méthodes vont gérer les clics sur les boutons. Ici, dans cette classe, nous créons une instance de AlarmManagerBroadcastReciever qui nous aidera à accéder à setAlarm (), cancelAlarm () et setOnetime (). Le reste du code est facile à comprendre.

package com.rakesh.alarmmanagerexample;

import com.rakesh.alarmmanagerexample.R;
import Android.os.Bundle;
import Android.app.Activity;
import Android.content.Context;
import Android.view.Menu;
import Android.view.MenuItem;
import Android.view.View;
import Android.widget.Toast;
import Android.support.v4.app.NavUtils;

public class AlarmManagerActivity extends Activity {

 private AlarmManagerBroadcastReceiver alarm;
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_alarm_manager);
        alarm = new AlarmManagerBroadcastReceiver();
    }

    @Override
 protected void onStart() {
  super.onStart();
 }

    public void startRepeatingTimer(View view) {
     Context context = this.getApplicationContext();
     if(alarm != null){
      alarm.SetAlarm(context);
     }else{
      Toast.makeText(context, 'Alarm is null', Toast.LENGTH_SHORT).show();
     }
    }

    public void cancelRepeatingTimer(View view){
     Context context = this.getApplicationContext();
     if(alarm != null){
      alarm.CancelAlarm(context);
     }else{
      Toast.makeText(context, 'Alarm is null', Toast.LENGTH_SHORT).show();
     }
    }

    public void onetimeTimer(View view){
     Context context = this.getApplicationContext();
     if(alarm != null){
      alarm.setOnetimeTimer(context);
     }else{
      Toast.makeText(context, 'Alarm is null', Toast.LENGTH_SHORT).show();
     }
    }

 @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.activity_widget_alarm_manager, menu);
        return true;
    }
}

Une fois que vous avez terminé avec le codage, exécutez simplement le projet et vous trouverez le même type d'application en cours d'exécution dans votre émulateur.

Veuillez télécharger https://github.com/rakeshcusat/Code4Reference/tree/master/AndroidProjects/AlarmManagerExamplecode , si vous avez besoin d'un code de référence.

Référence: Tutoriel sur Android AlarmManager de notre partenaire JCG Rakesh Cusat sur le blog Code4Reference.

http://code4reference.com/2012/07/tutorial-on-Android-alarmmanager/

1
Enrique San Martín