In this lab, you will learn how to start or bind to services in an Android app.
Remember:In this exercise we will create a very basic music player. We will play the music as a started service.
Download this mp3 file (or use your own) and add it to the directory res/raw (if raw directory does not exist, create it).
Create an app with two activities. The first will be a simple music player containing 3 buttons, a Start, a Stop and a NextPage button. The Start and Stop button will start / stop respectively playing a song as a service. The NextPage button will start the second activity (so we can see how the service is still running).
Create the two activities following the steps from previous classes on Intents.
Create a new Service class and call it MyService (it should extend Service). If you use Android Studio's New > Service > Service it will create an entry for this in the AndroidManifest.xml - this is the recommended way. If you create the class by hand, you need to declare it in the AndroidManifest, in the same place where activities are declared -
< service android:name=".MyService" android:enabled="true" android:exported="true" />
In your service class, make sure that IBinder onBind(Intent intent) returns null so that activities cannot bind to it.
In your service class, override the methods onCreate, onStartCommand (make sure to return Service.START_STICKY ) and the onDestroy methods.
We will use the Android MediaPlayer to play the music. Create a MediaPlayer object. You can load the music by creating a MediaPlayer with the constructor MediaPlayer.create(this, R.raw.my_mp3_file_name) and you can start and stop the player with start() and finish(). Initialize your player in the Service class method onCreate, start it in the onStartCommand and stop it in the onDestroy.
Test your player, what happens to the music when you switch activities? When you open another application?
In this exercise we will ask a service to return a random number generator whenever we click a button. As this is a request we will do from time to time, we will use a bounded service.
Create a Service class. In your service class create an inner class that extends Binder and that has a single method getService(). This methods should return a reference to the outer Service class.
In your Service class keep an attribute / variable of the inner class of Binder you defined before. Return the value of this variable in the method onBind().
Also in your Service class override the method OnTaskRemoved and make sure the service stops itself with stopSelf()
Create an empty activity with a button. Create a variable to reference your Service (eg call it mService).
Inside your activity define a ServiceConnection (use an anonymous inner class). Get the iBinder that comes as a parameter and cast it to the type of binder your have defined in your service (call it for example binder), use this binder to get a reference to the service (using the getService() method). Make sure you store that service in the variable you have kept in the previous step (mService).
Override the onStart() and onStop() methods. In the onStart() create an Intent for your Service and start it with bindService(intent, service_connection, Context.BIND_AUTO_CREATE). In the onStop() unbind the service with unbindService(connection).
When a button the button clicked, ask mService for a random number.
In this exercise we will create a Worker class to conduct difficult and long calculations for us that we want to do in the background (on a separate thread).
Create a class that extends Worker and override the doWork() method to calculate a random integer. Of course this is very fast, but imagine it was a hard task.
Create an empty activity with a button. Setup your work request with OneTimeWorkRequest r = new OnTimeWorkRequest.Builder(MyWorker.class) . Then you can make a request from different parts of the code (e.g., when the button is clicked) to ask for your worker to queue the request WorkManager.getInstance().enqueue(random_number_request);
Work managers are every powerfull and can do many things, look at the slides for further material if you are interested to learn more.
Extend your music player app by adding UI views on the interface that can help you control the music. You can use different methods available in MediaPlayer (e.g.Play audio with mp.start(), Pause audio with mp.pause(), Reset mediaplayer with mp.reset(), Get song length duration - in milliseconds with mp.getDuration(), Get current duration - in milliseconds with mp.getCurrentDuration(), Move song to particular second - used for Forward or Backward mp.seekTo(positon); // position in milliseconds, Check if song is playing or not mp.isPlaying(); // returns true or false.
L'objectif est d'apprendre comment interagir avec les APIs web existantes dans une application Android.
Rappel :Dans cet exercice, nous allons créer un simple lecteur de musique. Nous allons jouer la musique comme un service démarré (started service).
Télécharger ce mp3 file ((ou utilisez le vôtre) et ajoutez-le au répertoire res/raw (si le répertoire raw n'existe pas, créez-le)
Créez une application avec deux activités. La première sera un simple lecteur de musique contenant 3 boutons, un bouton Start, un bouton Stop et un bouton NextPage. Les boutons Start et Stop vont respectivement démarrer et arrêter la lecture d'une chanson en tant que service. Le bouton NextPage démarrera la deuxième activité (pour que nous puissions voir que le service est toujours en cours).
Créez les deux activités en suivant les cours précédents en utilisant des Intents.
Créez une nouvelle classe de service et appelez-la MyService qui extends Service. Si vous utilisez la commande New > Service > Service, Android Studio créera une entrée pour cette classe dans le fichier AndroidManifest.xml (c'est la méthode recommandée). Si vous créez la classe à la main, vous devez la déclarer dans AndroidManifest, au même endroit où sont déclarées les activités -
< service android:name=".MyService" android:enabled="true" android:exported="true" />
Dans votre classe de service, assurez-vous que IBinder onBind(Intent intent) renvoie null afin que les autres ne puissent pas se lier (bind).
Dans votre classe de service, Override les méthodes onCreate, onStartCommand (return Service.START_STICKY ) et la méthode onDestroy.
Nous allons utiliser le MediaPlayer d'Android pour lire la musique. Créez un objet MediaPlayer. Vous pouvez charger la musique en créant un MediaPlayer avec le constructeur MediaPlayer.create(this, R.raw.my_mp3_file_name) et vous pouvez démarrer et arrêter le lecteur avec start() et finish(). Initialisez votre lecteur dans la méthode de la classe Service onCreate, démarrez-le dans onStartCommand et arretez-le dans onDestroy.
Testez votre lecteur, que se passe-t-il avec la musique lorsque vous changez d'activité ? Lorsque vous ouvrez une autre application ?
Dans cet exercice, nous allons demander à un service de renvoyer un générateur de numéros aléatoires lorsque nous cliquons sur un bouton. Comme il s'agit d'une demande que nous ferons de temps en temps, nous utiliserons un service bounded.
Créez une classe de service. Dans votre classe de service, créez une classe interne qui extends Binder et qui a une seule méthode getService(). Cette méthode doit renvoyer une référence de l'instance de Service (classe externe).
Dans votre classe Service, gardez un attribut / une variable de la classe interne de ce Binder que vous avez définie précédemment. Retournez la valeur de cette variable dans la méthode onBind().
dans votre classe Service, remplacez la méthode OnTaskRemoved et assurez-vous que le service s'arrête de lui-même avec stopSelf()
Créez une Activity vide avec un bouton. Créez une variable pour référencer votre service (par exemple, appelez-la mService).
A l'intérieur de votre activité, définissez un ServiceConnection (utilisez une classe interne anonyme). Récupérez le iBinder qui arrive en paramètre et castez-le sur le type de binder que vous avez défini dans votre service (appelez-le par exemple binder), utilisez ce binder pour obtenir une référence au service (en utilisant la méthode getService()). Assurez-vous de stocker ce service dans la variable que vous avez conservée à l'étape précédente (mService).
Override les méthodes onStart() et onStop(). Dans onStart() créer un Intent pour votre service et le démarrer avec bindService(intent, service_connection, Context.BIND_AUTO_CREATE). Dans onStop() unbind le service en utilisant unbindService(connection).
Lorsqu'un bouton est cliqué, demander à mService un nombre aléatoire. et assurez-vous que le service s'arrête de lui-même avec
Dans cet exercice, nous allons créer une classe Worker pour effectuer à notre place des calculs difficiles et longs que nous voulons faire en arrière-plan (thread separé).
Créez une classe qui étend Worker et surchargez la méthode doWork() pour calculer un entier aléatoire. Bien sûr, c'est très rapide, mais imaginez que c'était une tâche difficile.
Créez une activité vide avec un bouton. Configurez votre work request avec OneTimeWorkRequest r = new OnTimeWorkRequest.Builder(MyWorker.class) . Ensuite, vous pouvez faire une demande à partir de différentes parties du code (par exemple, lorsque le bouton est cliqué) pour demander à votre travailleur de mettre la demande en file d'attente WorkManager.getInstance().enqueue(random_number_request);
Les Work managers sont très puissants et peuvent faire beaucoup de choses, regardez les diapositives pour plus de matériel si vous êtes intéressé à en savoir plus.
Étendez votre application de lecteur de musique en ajoutant des vues d'interface utilisateur sur l'interface qui peuvent vous aider à contrôler la musique. Vous pouvez utiliser différentes méthodes disponibles dans MediaPlayer (e.g. Play audio avec mp.start(), Pause audio avec mp.pause(), Reset mediaplayer avec mp.reset(), Obtenez la durée de la chanson - en millisecondes avec mp.getDuration(), Obtenez la durée actuelle - en millisecondes avec mp.getCurrentDuration(), Déplacer la chanson à une seconde particulière - utilisé pour Forward ou Backward mp.seekTo(positon); // Position en millisecondes, vérifie si la chanson est en cours de lecture ou non mp.isPlaying(); // true ou false.