Programmation de composant mobiles aka Android Wies law Zielonka 10 décembre 2015
Toolbar
Toolbar remplace Actionbar (Android 5.0 Lollipop) Dans AndroidManifest.xml utiliser un thème sans ActionBar : 1 <application 2.... 3 android:theme= @style /Theme.AppCompat. NoActionBar > 4 > dans build.gradle indiquer la bibliothèque de support : dependencies { compile filetree(dir: libs, include: [ *.jar ]) compile com.android.support:appcompat-v7:23.1.0... }
Toolbar à la place de Actionbar Dans le fichier layout de Activity ajouter : 1 <android. support. v7. widget. Toolbar 2 android:id= @+id/toolbar 3 android:layout width= match parent 4 android:layout height= wrap content 5 android:background= #2196F3 6 android:minheight=?attr/actionbarsize /> Instancier Toolbar dans l activité : 1 public class MainActivity extends AppCompatActivity { 2 protected void oncreate(bundle savedinstancestate) { 3 super. oncreate ( savedinstancestate ); 4 setcontentview (R. layout. activity main ); 5 Toolbar toolbar = (Toolbar ) findviewbyid(r. id. toolbar 6 setsupportactionbar ( toolbar ); 7 } 8 }
Créer fichier xml pour le menu Le fichier res/menu/menu afficher.xml : 1 menu xmlns:android= http://schemas. android.com/apk/res/androi 2 xmlns:app= http: //schemas. android.com/apk/res auto 3 xmlns:tools= http://schemas. android.com/tools 4 tools:context=. MainActivity > 5 6 <item android:id= @+id/action supprimer 7 android:title= @string /action supprimer 8 android:icon= @drawable/ic supp 9 app:showasaction= never /> 10 <item android:id= @+id/action annuler 11 android:title= @string /action annuler 12 app:showasaction= never /> 13 </menu> Les valeurs de l attribut showasaction : ifroom l élément parmi les actions principales si de la place never jamais parmi les actions principales always toujours parmi les actions principales withtext affiché le texte de l action
Créer le menu dans Activity 1 @Override 2 public boolean oncreateoptionsmenu(menu menu) { 3 // Inflate the menu; this adds items to the action bar if i 4 getmenuinflater (). inflate (R.menu. menu afficher, menu); 5 return true ; 6 }
Les traitement des menu items 1 public boolean onoptionsitemselected (MenuItem item) { 2 // Handle action bar item clicks here. The action bar wi 3 // automatically handle clicks on the Home/Up button, so 4 // as you specify a parent activity in AndroidManifest. xm 5 int id = item. getitemid (); 6 7 //noinspection SimplifiableIfStatement 8 switch( id ){ 9 case R. id. action supprimer : 10 //traitement de supprimer 11 return true ; 12 case R. id. action annuler : 13 //traitement d annuler 14 return true ; 15 default : 16 return super. onoptionsitemselected (item ); 17 } 18 }
Ajouter le bouton de retour vers l activité parent dans Toolbar Dans oncreate : 1 Toolbar toolbar = (Toolbar) findviewbyid(r. id. toolbar ); 2 setsupportactionbar ( toolbar ); 3 ActionBar bar = getsupportactionbar (); 4 bar. setdisplayhomeasupenabled ( true ); setdisplayhomeasupenabled(true) provoque l affichage du bouton back dans Toolbar.
Ajouter le bouton de retour vers l activité parent dans Toolbar Spécifier le parent de l activité dans AndroidManifest : 1 <activity android:name=. MaActivite 2 android:parentactivityname=. MainActivity 3...> 4 <activity 5 android:name=. ProductActivity 6 android:label= @string /title activity product 7 android:parentactivityname=. MainActivity > 8 <meta data 9 android:name= android. support.parent ACTIVITY 10 android:value=. MainActivity /> 11 </ activity> en mettant le nom du parent à la place de MainActivity. La solution avec meta pour la version 4.0 ou plus ancienne.
Notifications
Notifications Notification pour attirer l attention de l utilisateur : afficher status bar icon flasher la lumière faire vibrer le téléphone alerte sonore afficher des infos dans notification tray diffusion de BroadcastIntents Notification utilisées par les composants invisibles (Broadcast receivers, Services) pour alerter l utilisateur.
Notification Manager Notification manager gère les notifications : 1 String svcname = Context.NOTIFICATION SERVICE; 2 NotificationManager notificationmanager ; 3 notificationmanager = 4 ( NotificationManager ) getsystemservice(svcname);
Construire un Notification.Builder 1 private Notification. Builder notificationbuilder () { 2 Notification. Builder builder = 3 new Notification. Builder ( MainActivity. this ); 4 5 return builder. setsmallicon(r. drawable. ic launcher ) 6. setcontenttitle ( Notification Builder ) 7. setcontenttext( very long content text ) 8. setwhen(system. currenttimemillis ()) 9. setdefaults ( Notification.DEFAULT SOUND 10 Notification.DEFAULT VIBRATE) 11. setsound( 12 RingtoneManager. getdefaulturi ( 13 RingtoneManager.TYPE NOTIFICATION)) 14. setvibrate (new long []{1000, 1000, 1000, 1000, 1000} 15. setlights (Color.RED, 0, 1); 16 }
Envoyer une notification 1 private static final int NOTIFICATION ID=1; 2 3 notificationmanager. notify (NOTIFICATION ID, 4 notificationbuilder (). build ());
Supprimer Notification 1 notificationmanager. cancel (NOTIFICATION ID);
Services
Pourquoi les services Pour exécuter les opérations qui prennent du temps : récupérer les données sur internet, mettre à jour les ContentProviders, envoyer les Intents, declencher les notifications, jouer la musique. Possibilité de configurer pour restart si le service est arrêté par android.
Créer un service 1 public class MyService extends Service { 2 3 @Override 4 public void oncreate () { 5 // le code a executer a la creation de service 6 } 7 8 @Override 9 public IBinder onbind( Intent intent ) { 10 // a faire 11 } 12 13 @Override 14 public int onstartcommand( Intent intent, int flags, 15 int startid ) { 16 startbackgroundtask ( intent, startid ); 17 return Service.START STICKY; 18 } 19 20 private void startbackgroundtask ( Intent intent, 21 int startid ){ 22 // implementer le thread qui fait le travail en backgroud
Service.START STICKY le service sera automatiquement redémarré (avec Intent null) s il était arrêté par le système.
Enregistrer le service dans Manifest 1 <service android:enabled= true 2 android:name=. MyService 3 \>
Attacher le service à une activité C est nécessaire seulement si on a besoin d accéder au service depuis l activité. Dans le service : 1 @Override 2 public IBinder onbind( Intent intent ) { 3 return binder ; 4 } 5 6 public class MyBinder extends Binder { 7 MyService getservice () { 8 return MyService. this ; 9 } 10 } 11 private final IBinder binder = new MyBinder (); Binder - l objet distant créé dans un autre processus. IBinder l interface pour un objet distant.
Attacher le service à une activité Dans l activité : 1 private MyService serviceref ; 2 //gere la connexion entre le service et l activite 3 private ServiceConnection mconnection = 4 new ServiceConnection () { 5 public void onserviceconnected (ComponentName classname, 6 IBinder service ) { 7 // appele quand la connexion entre 8 // le service et activite est active 9 serviceref = (( MyService. MyBinder) service ). getservice (); 10 } 11 12 public void onservicedisconnected(componentname classname) { 13 // appele quand le service se deconnecte 14 serviceref = null ; 15 } 16 };
Attacher le service à une activité Dans l activité (suite) : 1 //attacher le service 2 private void bindtoservice () { 3 //attache l activite au service 4 Intent bindintent = new Intent (MyActivity. this, 5 MyService. class ); 6 bindservice ( bindintent, mconnection, 7 Context.BIND AUTO CREATE); 8 }
Démarrer le service Démarrer un service (dans l activité ou dans un autre service ou dans ContentProvider, peu importe) : 1 private void explicitstart () { 2 // demarrer explicitement MyService 3 Intent intent = new Intent ( this, MyService. class ); 4 // ajouter les extras si besoin 5 startservice ( intent ); 6 }
Arrêter le service Depuis une activité : 1 stopservice (new Intent ( this, MyService. class )); Le setvice peut s arrêter lui même en appelant la méthode 1 void stopself ()
IntentService IntentService est une sous classe de Service qui simplifie la tâche de gestion de thread background. Le thread background est créé automatiquement par IntentService. Il suffit de créer une sous classe de IntentService et d implémenter la méthode abstraite : 1 protected void onhandleintent ( Intent intent ) Cette méthode sera exécutée automatiquement dans un thread arrière plan. Par contre il vaut mieux éviter d implémenter onstartcommand dans IntentService.