IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Android Discussion :

passage d'un parcelable entre activité via un BroadcastReceiver


Sujet :

Android

  1. #1
    Membre du Club
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Mai 2011
    Messages
    52
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Chef de projet en SSII
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2011
    Messages : 52
    Points : 60
    Points
    60
    Par défaut passage d'un parcelable entre activité via un BroadcastReceiver
    bonjour,

    J'ai une activité qui passe un objet Alarm
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    
    import android.os.Parcel;
    import android.os.Parcelable;
    import android.text.format.Time;
    import android.util.Log;
    
    public class Alarm implements  Parcelable
    {
    
    	private Time heure;
    	private boolean active;
    	private int Rappel;
    	
    	public Alarm(Parcel source) {
    		// TODO Auto-generated constructor stub
    		
    			heure.set(source.readLong());
    			this.active = (source.readInt() == 1);
    			this.Rappel = source.readInt();
    			
    	}
    	
    	public Alarm() {
    		// TODO Auto-generated constructor stub
    	}
    
    	public Time getHeure() {
    		return heure;
    	}
    	public void setHeure(Time heure) {
    		this.heure = heure;
    	}
    	public boolean isActive() {
    		return active;
    	}
    	public void setActive(boolean active) {
    		this.active = active;
    	}
    	/* (non-Javadoc)
    	 * @see java.lang.Object#toString()
    	 */
    	/**
    	 * @return the rappel
    	 */
    	public int getRappel() {
    		return Rappel;
    	}
    	/**
    	 * @param rappel the rappel to set
    	 */
    	public void setRappel(int rappel) {
    		Rappel = rappel;
    	}
    	@Override
    	public int describeContents() {
    		// TODO Auto-generated method stub
    		return 0;
    	}
    	@Override
    	public void writeToParcel(Parcel dest, int flags)
    	{
    		Log.i("Alarm","*************** "+heure.toMillis(true)+" *************");
    		dest.writeLong(heure.toMillis(true));
    		dest.writeInt(active ? 1 :0);
    		dest.writeInt(Rappel);
    		
    	}
    	
    	
    	public static Parcelable.Creator<Alarm> getCreator()
    	{
    		return CREATOR;
    	}
    
    	public static final Parcelable.Creator<Alarm> CREATOR = new Parcelable.Creator<Alarm>()
    	{
    		@Override
    		public Alarm createFromParcel(Parcel source)
    		{
    			return new Alarm(source);
    		}
    
    		@Override
    		public Alarm[] newArray(int size)
    		{
    			return new Alarm[size];
    		}
    	};
    comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    	private void planifierAlarm() {
    		//Récupération de l'instance du service AlarmManager.
    		AlarmManager am = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
    
    		//On instancie l'Intent qui va être appelé au moment du reveil.
    		Intent intent = new Intent(this, AlarmReceiver.class);
    	    intent.putExtra("Alarm", alarm);
    		
    		//On créer le pending Intent qui identifie l'Intent de reveil avec un ID et un/des flag(s)
    		PendingIntent pendingintent = PendingIntent.getBroadcast(this, ALARM_ID, intent, 0);
    Dans le Receiver je le recupère comme cela :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
     
    public class AlarmReceiver extends BroadcastReceiver{
     
    	public static final int ID_NOTIFICATION = 1963;
     
    	@Override
    	public void onReceive(Context context, Intent intent) {
    		try {
    			NotificationManager notificationManager = 
    				(NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);
    			Alarm alarm = null;
    		// On créer la notification
    		// Avec son icône et son texte défilant (optionel si l'on veut pas de
    		// texte défilant on met cet argument à null)
    		Notification notification = new Notification(R.drawable.Seballader,
    				"notification SeBallader !", System.currentTimeMillis());
    		 //final byte[] data = intent.getByteArrayExtra("Alarm");
    		final Bundle data=intent.getExtras(); 
     
     
     
    		Intent defineIntent = new Intent(context, Replannif.class);
    		defineIntent.putExtra("Alarm", data);
     
    	//	putByteArrayExtra("Alarm", alarm);
     
    	     final PendingIntent pendingIntent = PendingIntent.getActivity(context, 0, defineIntent, PendingIntent.FLAG_UPDATE_CURRENT); 
     
    		// On définit le titre de la notif
    		String titreNotification = "Ok ????!";
     
    		// On définit le texte qui caractérise la notif
    		String texteNotification = "cliquer pour confirmer ou infirmer votre Arrivé";
     
    		// On configure notre notification avec tous les paramètres que l'on
    		// vient de créer
    		notification.setLatestEventInfo(context, titreNotification,texteNotification, pendingIntent);
    		// On ajoute un style de vibration à notre notification
    		// L'utilisateur est donc également averti par les vibrations de son
    		// téléphone
    		// Ici les chiffres correspondent à 0sec de pause, 0.2sec de vibration,
    		// 0.1sec de pause, 0.2sec de vibration, 0.1sec de pause, 0.2sec de
    		// vibration
    		// Vous pouvez bien entendu modifier ces valeurs à votre convenance
    		notification.vibrate = new long[] { 0, 200, 100, 200, 100, 200 };
    		notification.flags|=Notification.FLAG_AUTO_CANCEL;
    		// Enfin on ajoute notre notification et son ID à notre gestionnaire de
    		// notification
    		notificationManager.notify(ID_NOTIFICATION, notification);
     
    		}
    		catch (Exception r) {
    			Toast.makeText(context, "Erreur.",Toast.LENGTH_SHORT).show();
    			r.printStackTrace();
    		}
    	}
    je récupère le parcelable dans l'activité Replannif.class comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
     
    		//Mise en place de L'alarm
    		Alarm alarm = getIntent().getExtras().getParcelable("Alarm");
    j'ai l'erreur suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    02-26 19:34:03.260: E/AndroidRuntime(496): java.lang.RuntimeException: 
    Unable to start activity ComponentInfo{com.dinasoft.Seballader/com.dinasoft.Seballader.chemin.Replannif}:
    java.lang.ClassCastException: android.os.Bundle
    Comment je dois faire car je pense que dans le AlarmReceiver ne ne dois pas le repasser en Bundle ?

    Je ne sais pas du tout comment faire

    De plus j'ai en doute sur le faite de passer un Time dans Parcelable en Long

    merci de vos réponses

  2. #2
    Membre du Club
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Mai 2011
    Messages
    52
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Chef de projet en SSII
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2011
    Messages : 52
    Points : 60
    Points
    60
    Par défaut j'ai trouvé
    il faut absolument placer dans l'objet Alarm placer
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    public Alarm(Parcel source) {
    		// TODO Auto-generated constructor stub
    			this.heure=new Time();			
    this.heure.set(source.readLong());
    			this.active = (source.readInt() == 1);
    			this.Rappel = source.readInt();
    	}
    l'activité appelant le BroadcastReceiver :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    			intent.putExtra("Alarm", alarm);
    			//On créer le pending Intent qui identifie l'Intent de reveil avec un ID et un/des flag(s)
    			PendingIntent pendingintent = PendingIntent.getBroadcast(this, ALARM_ID, intent,PendingIntent.FLAG_UPDATE_CURRENT);
    			//On annule l'alarm pour replanifier si besoin
    			am.cancel(pendingintent);
    			am.set(AlarmManager.RTC_WAKEUP, System.getTimeInMillis(), pendingintent);
    dans PlannifAlarm placer un FLAG_UPDATE_CURRENT dans le GetActivity comme ceci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
     
    @Override
    	public void onReceive(Context context, Intent intent) {
    		try {
    			NotificationManager notificationManager = 
    				(NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);
     
    					Notification notification = new Notification(R.drawable.seballader,
    					"notification SeBallader!", System.currentTimeMillis());
     
     
    			final Bundle bundle=intent.getExtras();
     
    			if (bundle != null)
    			{
    				Alarm alarm = bundle.getParcelable("Alarm");
     
    				Intent defineIntent = new Intent(context, Replannif.class);
    				defineIntent.putExtra("Alarm", alarm);
     
    				final PendingIntent pendingIntent = PendingIntent.getActivity(context, 0, defineIntent, PendingIntent.FLAG_UPDATE_CURRENT);
    et dans l'activité récepteur (pour moi Replannif.class) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    	 alarm = (Alarm) getIntent().getExtras().get("Alarm");
    cordialement

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 3
    Dernier message: 18/06/2015, 12h40
  2. Passage de données entre activitées
    Par hossamoukli dans le forum Android
    Réponses: 3
    Dernier message: 21/04/2013, 04h53
  3. Passage de variable entre activités indépendantes
    Par guigui14077 dans le forum Android
    Réponses: 2
    Dernier message: 23/02/2013, 00h20
  4. Passage de variables entre activité
    Par med-angelo dans le forum Android
    Réponses: 2
    Dernier message: 04/03/2010, 16h01
  5. Réponses: 15
    Dernier message: 24/01/2006, 17h08

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo