2010-12-15 6 views
18

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

+0

La source du réveil - https://android.googlesource.com/platform/packages/apps/DeskClock/+/master/src/com/android – fiction

+0

À partir selon un calendrier peut également être réalisé par l'application [AutomateIt] (https://play.google.com/store/apps/details?id=AutomateIt.mainPackage&hl=fr). La minuterie peut être définie et l'application que vous choisissez sera lancée à une heure précise. –

+0

Beaucoup de programmes de réveil (tels que Alarm Clock Plus) incluent la possibilité de démarrer un programme à un moment donné, si vous voulez laisser un autre programme faire le gros du travail pour vous. – Zoot

Répondre

12

Vous pouvez le faire avec AlarmManager, voici un petit exemple. D'abord, vous devez 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 recepteur avec code à exécuter votre application: (IE- à partir de votre application):

public class MyAppReciever extends BroadcastReceiver { 

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

    startActivity(new Intent(context, MyAppMainActivity.class)); 
    } 
} 
+2

Je pense qu'il manque quelque chose: am.set (AlarmManager.RTC_WAKEUP, futureDate.getTimeInMillis (), expéditeur); –

+0

mon objet Date n'a pas de méthode "getTimeInMillis"() .. – flipperweid

11

Vous êtes probablement à la recherche de AlarmManager, qui vous permet de démarrer des services/activités/envoyer des diffusions à des intervalles spécifiques ou à un moment donné, répétition ou non. C'est ainsi que vous écrivez des services de fond amicaux de mémoire dans android. AlarmManager est un peu comme cron dans unix. Cela permet à votre service d'arrière-plan de démarrer, de faire son travail et de manquer de mémoire.

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

+0

effectivement je veux exécuter mon activité principale: DI comprendre que votre approche est moins invasive mais je veux aussi faire quelque chose d'invasif: P – TiGer

1

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

est ici c & p:

Android AlarmManager tutoriel par Rakesh Cues t le 20 septembre 2012 | Archivé dans: Android Core

Lors de l'écriture d'une application, il est nécessaire de planifier l'exécution du code dans le futur. Vous pouvez demander à AlarmManager de programmer votre travail à une heure spécifiée. AlarmManager accède à l'alarme du système et planifie l'exécution du code même lorsque l'application n'est pas en cours d'exécution. Information sur le projet: Méta-information sur le projet. Version Plate-forme: API Android 10. Niveau IDE: Eclipse Helios service Release 2 Emulator: Android 4.1

Pré-requis: connaissance préliminaire du cadre d'applications Android, et l'intention récepteur de diffusion.

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 être instancié 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 exécuter le code de votre application à un moment précis, même si votre application n'est pas en cours d'exécution. Pour d'autres manipulateurs d'opération de synchronisation, il faut utiliser car il est facile à utiliser. Handler est couvert dans un autre tutoriel.

Description de la méthode set() Planifie une alarme pour une fois. setInexactRepeating() Planifie une alarme avec une 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 d'AlarmManager pour plus d'informations.

Dans ce tutoriel, nous allons apprendre à créer une minuterie à usage unique et la minuterie à répétition, ainsi qu'à annuler la minuterie à répétition. Ici le minuteur et l'alarme ont été utilisés de manière interchangeable, mais dans ce contexte de tutoriel, les deux ont la même signification.

Exemple de code:

Créons trois boutons Start timer répéter, répéter annuler la minuterie et la minuterie une seule fois dans le fichier de mise en page. Ces boutons sont attachés avec les méthodes i.e startRepeatingTimer, cancelRepeatingTimer et onetimeTimer respectivement. Ces méthodes seront définies dans la classe Activity. Le fichier de disposition 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 appelée dès que l'intention est reçue. Une fois que nous avons reçu 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, par exemple, ONE_TIME, indique essentiellement si cette intention était associée à une temporisation unique ou répétitive. Une fois la valeur du paramètre ONE_TIME extraite, le message Toast est affiché en conséquence. Des méthodes auxiliaires ont également été définies, qui peuvent être utilisées depuis d'autres endroits à l'aide d'objets tels que setAlarm(), cancelAlarm() et onetimeTimer(). Ces méthodes peuvent également être définies ailleurs pour faire fonctionner le timer, par exemple set, cancel, etc. Pour garder ce tutoriel simple, nous l'avons défini dans BroadcastReceiver. SetAlarm(): Cette méthode définit l'alarme répétée à l'aide de la méthode setRepeating(). setRepeating() méthode nécessite quatre arguments:

type d'alarme, temps de déclenchement: le mettre à l'heure actuelle intervalle en millisecondes: dans cet exemple, nous passons 5 secondes (1000 * 5 millisecondes) d'intention en attente: Il sera enregistré avec cette alarme. Lorsque l'alarme est déclenchée, pendingIntent sera diffusé. cancelAlarm(): Cette méthode annule l'alarme précédemment enregistrée en appelant la méthode cancel(). La méthode cancel() prend pendingIntent comme argument. Le pendingIntent devrait correspondre à un, seulement alors la méthode cancel() peut enlever l'alarme du système.

onetimeTimer(): Cette méthode crée une alarme unique. Cela peut être réalisé en appelant la méthode set(). Procédé ensemble() prend trois arguments:

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

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 est le fichier manifeste. Ici, l'autorisation WAKE_LOCK est requise car le verrou de sillage est utilisé lors du traitement de 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> 

Maintenant, définissons 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, il suffit d'exécuter 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/

Questions connexes