Passer un objet d’une Activity à une autre
Cette astuce peut s’avérer relativement utile lorsque l’objet en question est peuplé depuis une source externe comme un flux RSS, ce qui peut parfois demander un temps d’attente assez long. La méthode utilise le principe de serialization qui va tout simplement transformer nos objets ‘Serializable’ en byte[].
Pour cela, nous disposons d’une classe, à partir de laquelle, les objets que nous souhaitons sérialiser devront hériter. De la sorte, vos objets pourront être passés très simplement d’une Activity à une autre.
public class CSerializable implements Serializable {
public byte[] serialize () throws IOException {
ByteArrayOutputStream bos = new ByteArrayOutputStream ();
ObjectOutput out = new ObjectOutputStream (bos);
out.writeObject (this);
out.close ();
return bos.toByteArray ();
} // serialize ();
public Object unserialize (byte[] b) throws IOException,
ClassNotFoundException {
ByteArrayInputStream bis = new ByteArrayInputStream (b);
ObjectInputStream in = new ObjectInputStream (bis);
Object object = in.readObject ();
bis.close ();
in.close ();
return object;
} // unserialize ();
}; // CSerializable;
Pour continuer, voici un exemple vraiment très simple d’objet devant hériter de la classe CSerializable.
public class CTest extends CSerializable {
protected String title, content;
protected Date date;
public void populate (byte[] serialize)
throws IOException, ClassNotFoundException {
CTest object = (CTest)unserialize (serialize);
setTitle (object.getTitle ());
setContent (object.getContent ());
setDate (object.getDate ());
} // populate ();
public String getTitle () {return title;}
public void setTitle (String title) {this.title = title;}
public String getContent () {return content;}
public void setContent (String content) {this.content = content;}
public Date getDate () {return date;}
public void setDate (Date date) {this.date = date;}
}; // CTest;
Le passage de l’objet de l’Activity 1 vers la 2 se résumer alors à ce qui va suivre:
// CActivity1
CTest test = new CTest ();
test.setTitle ("Mon titre");
test.setContent ("Mon contenu");
test.setDate (new Date ());
Intent intent = new Intent (getApplicationContext (), CActivity2.class);
intent.putExtra ("test", test.serialize ());
startActivity (intent);
// CActivity2
byte[] testArray = getIntent ().getExtras ().getByteArray ("test");
CTest test = new CTest ();
test.populate (testArray);
Evolution du CSS et les vieux navigateurs, quelle méthode choisir ?
Durant la phase d’intégration d’un projet, il arrive très souvent que l’on soit tenté d’utiliser toutes les nouvelles propriétés CSS(3), c’est plus pratique, c’est plus beau et surtout c’est plus efficace qu’utiliser des images qui feront indéniablement augmenter le temps de chargement de nos pages web.
Mais pour un grand nombre d’entres-nous, se pose directement la question: « Oui mais, ça donnerait quoi sur les vieux navigateurs ? » … pour ne pas citer Internet Explorer et ses nombreuses tentatives de réajustement (c’est tellement vrai)! Ceci-dit, il faut tout de même avouer qu’ils ont fait de très gros progrès depuis IE9, on en serait presque tout émoustillé.
Malheureusement, ces vieux navigateurs occupent une petite part du marché qui titillent encore notre conscience professionnelle pour finalement nous pousser à réaliser l’effort ultime (ok … j’exagère un peu)!
Cas d’école: les bords arrondis
C’est certainement la propriété que j’utilise à coup sûr lorsque je commence l’intégration d’un projet. Il faut reconnaître, que même très léger, un bord arrondi c’est toujours plus beau et sympatique qu’un bord qui ne l’est pas, en plus les graphistes s’en donnent à coeur joie.
En décortiquant un peu le CSS mis en place à cette occasion, voilà ce que l’on peut trouver (rien de bien extraordinaire):
border-radius: 5px;
-moz-border-radius: 5px;
-webkit-border-radius: 5px;
On distingue très rapidement les propriétés dites « standards » de celles qui sont propriétaires -moz, -webkit et j’en passe. Oui mais voilà, dans ce cas précis, il n’existe aucun moyen en CSS d’appliquer ce type de propriété sous Internet Explorer < 9. C’est bien dommage mais fort heureusement, au moins deux possibilités s’ouvrent généreusement à nous: l’utilisation d’images et celui du javascript.
Les images
Avantages
- Si elles sont bien découpées, elles prendront moins de temps à charger qu’un script JS ;
- Le rendu est scrupuleusement identique à celui fourni par nos graphistes.
Inconvénients
- S’il s’agit de PNG transparent, sous IE 6 cette option est à bannir … ou alors il faudrait faire intervenir du JS … heeuu …?
- Au contraire, si vos images sont mal traitées, le temps de chargement deviendrait alors problèmatique (il n’y a très rarement qu’un seul bord arrondi … donc il y aura forcement plusieurs images).
Le Javascript
Avantages
- Plus aucune question à se poser, il suffit de lire la doc de la bibliothèque de votre choix, et si elle est correctement développée, le problème de compatibilité ne se posera même pas.
Inconvénients
- Le temps de chargement du script, ajouté à cela, son temps d’exécution ! Il faut penser à remettre les choses dans leurs contextes, les vieux navigateurs n’étaient pas autant optimisés que maintenant, le javascript était beaucoup plus long à s’exécuter ;
- Si le Javascript est désactivé … ç’est encore possible ça ? … hey ho c’est fini le temps des gifs animés (une période traumatisante) !
Quelle option adopter alors ?
Personnellement j’ai choisi de bannir catégoriquement l’utilisation du JS à cause des inconvénients cités ci-dessus qui laissent trop souvent apparaître un effet désagréable de clipping en fin de chargement des pages. De la même manière, j’évite au maximum (voir complètement) l’utilisation d’images, mais il faut dire que ça peut parfois vous sauver la vie.
Qu’elle est la solution miracle ?
J’ai pris pour habitude d’appliquer la méthode de dégradation passive … oula, mais qu’est-ce qu’il nous raconte lui ? Le but consiste à intégrer normalement une charte graphique en laissant le rendu se dégrader visuellement sur les anciens navigateurs. Lorsque j’emploie le terme de dégradation, je parle uniquement du rendu, en aucun cas l’affichage du site ne doit en être altéré, ou alors la phase d’intégration aura été un échec (… mais pourquoi ma colonne s’affiche-t-elle dans le footer … ?).
Cela signifie tout simplement qu’il n’y aura pas de bord arrondi … mais est-ce que c’est si grave lorsqu’on sait qu’un très faible pourcentage des internautes en sera affecté ? Est-ce que ça les empêchera de naviguer correctement et confortablement sans temps de chargement supplémentaire, ou effets visuels désagréables ?
Fort heureusement, on rencontre ce genre de problème uniquement sous Internet Explorer. En règle général il y a très peu de surprises sur les autres navigateurs, je vous conseille au passage ce site qui référence très bien les compatibilités CSS avec tous les navigateurs dans toutes les versions (je suis fan).
Il s’agit d’un exemple concret qui peut très bien s’appliquer à d’autres propriétés CSS ou pseudos-selecteurs.
Pour terminer, je pense aussi que laisser croire les internautes qu’ils sont toujours à la pointe de la technologie par l’émulation n’est pas la meilleure des solutions. Libre à vous d’appliquer la méthode de votre de choix, car l’avantage du travail d’intégration, c’est que chacun peut faire comme il veut même si au final on se pose tous les mêmes questions.
Android: Contrôler votre PC à l’aide de votre portable ou votre tablette.
Télécharger le logiciel de communication
Télécharger l’application Android
Après 3 à 4 bonnes semaines de travail (environ 40h), j’ai enfin réussi à terminer une première version de ma toute première application sous Android. Son but est de vous permettre de contrôler votre PC depuis une tablette (de préférence car mieux adaptée qu’un portable avec un petit écran). En somme, votre tablette devient votre souris et votre clavier.
Pour cela, il faut au préalable lancer un programme sur votre ordinateur (pour le moment uniquement compatible sous Windows), qui va permettre de réaliser les échanges PC <> Android. Saisir un identifiant, un mot de passe, et d’activer les communications.
Ensuite, il ne vous reste plus qu’à lancer l’application sous Android et de vous connecter au PC pour lequel nous venons juste d’activer les communications.
Au début, l’utilisation peut paraître relativement déroutante car j’ai pour le moment souhaité aller au plus simple. Lorsque vous déplacerez le pointeur depuis votre tablette, les mouvements se feront de manière proportionnelle avec la résolution de votre écran. En clair, le coin supérieur-gauche de votre tablette correspond au coin supérieur-gauche de votre écran, et pour le coté droit, c’est la même chose.
Pour le clic-gauche, il faut garder une pression sur la tablette pour le contrôle du pointeur, et en réaliser une supplémentaire pour lancer cette action. Le plus simple est d’utiliser les deux mains, une pour le contrôle du pointeur (tout comme vous le faites en gardant votre main sur la souris), et une autre pour réaliser les actions (clic-gauche / clic-droit). Le clic-droit quant à lui, est réalisé à l’aide d’une troisième pression supplémentaire.
Il est aussi possible d’utiliser le clavier, pour cela il suffit d’aller dans le menu (durant la phase de contrôle) et de l’activer. Attention, dans cette première version toutes les touches ne sont pas encore supportées. Pour l’instant vous pouvez utiliser les lettres (minuscules et non accentuées), les chiffres, ainsi que les touches espace, entrer et supprimer.
Je ne sais pas encore si je vais continuer le développement, mon objectif étant simplement d’apprendre à développer sous Android par le biais de travaux que je publierai très certainement sur mon blog.
Coté serveur (PC):
Développé avec JAVA, utilise SWT pour l’interface.
Coté client (Tablette):
Développé en JAVA, API 7 (2.1-update1) de Android.
Les communications sont réalisées en TCP pour garder les connexions ouvertes entre les clients et le serveur, et en UDP pour la phase de contrôle.
Uniquement testé depuis ma tablette ASUS EEE Pad Transformer TF101 et mon Galaxy TEOS, ça devrait normalement fonctionner quasiment partout … à voir!



