This course will be retired on June 1, 2025.
Heads up! To view this whole video, sign in with your Courses account or enroll in your free 7-day trial. Sign In Enroll
Preview
Start a free Courses trial
to watch this video
In this video we’ll finish refactoring our app to use a Messenger so our app can take advantage of running in multiple Processes!
Related Links
Related Discussions
Have questions about this video? Start a discussion with the community and Treehouse staff.
Sign upRelated Discussions
Have questions about this video? Start a discussion with the community and Treehouse staff.
Sign up
Switching our focus over to main activity,
0:00
let's start by deleting
the mPlayerService field.
0:03
This makes it easy to see all the places
where we need to make changes.
0:10
Next, let's create a new class for
activities handler, and
0:14
let's call it activityHandler.
0:18
Then let's make it extends handler and
let's override the handle message method.
0:25
Control O, handle message.
0:32
Let's get rid of the call to super.
0:37
The only way for this method to be
called is if our activities handler
0:41
is hearing back from our services handler
about whether music is playing or not.
0:45
And remember that if music is not playing,
message.arg1 should be zero.
0:50
So if message.arg1 is zero, and
0:56
let's add a comment that
music is not playing.
1:01
Then let's add an else if for
when arg1 is one.
1:12
And let's add a comment for this, as well.
1:21
Music is playing.
1:25
Back in the first IF statement,
let's add two more comments for
1:27
what we're trying to accomplish.
1:31
Play the music and
change play Button to say "Pause".
1:34
Then let's copy these
comments into the L sieve
1:44
And update them to say Pause the music,
and change play button to say play.
1:52
To play the music,
2:00
we need to send a message with an ARG
one of zero to our services handler.
2:01
Below our play the music comment, let's
create a new message, message message.
2:07
Equals Message.obtain and
2:15
said it's arg1 to 0, message.arg1 = 0.
2:17
Then we need to use our services
messenger to send the message.
2:22
We could grab this messenger from the
activity, but wouldn't it be nice if it
2:28
was just the reply to of the message
we received back in player handler?
2:32
And case two below,
where we said arg1 let's
2:41
set our message's reply to
to our services messenger.
2:45
But first, we'll need to make
our services messenger public so
2:53
we can access it from this
class over employer service,
2:59
set our messenger to public,
then back in player handler.
3:04
Let's set that messenger as our
messages reply to property, equals
3:10
employer service dot m messenger.
3:15
Now back in our activity handler,
we can call
3:20
message, msg.reply to get
the messenger of our service,
3:27
.send and pass in our message.
3:33
And let's use alt+enter
to handle the exception.
3:39
Then let's copy and paste this code
below our pause the music comment,
3:43
and change our one to be equal to one.
3:51
Now we just need a way to change the text
of our play button from our handler,
3:57
just like we did with
our services handler.
4:02
Let's create a field from main activity,
private main
4:04
activity in main activity and
4:10
lets add a constructor that takes
the main activity as the parameter.
4:14
Public, activity handler, main activity,
which we'll call main activity,
4:18
and inside, let's set our field to
be equal to the pastan parameter.
4:27
mMainActivity equals mainActivity.
4:33
Next, let's add a public
method to mainActivity
4:36
to let us change the text
of our play button.
4:40
Let's add it below on create and
call it change play button text,
4:43
public void change play button text,
4:49
and it takes in a string,
which we'll call text.
4:58
And inside this method,
let's update the text of our play button,
5:04
mPlayButton.setText, and
pass in our text parameter.
5:07
Finally, back in our activity handler,
let's use this method to update our text
5:15
So below the change play button
to say pause comment, we'll write
5:24
mMainActivity dot changePlayButtonText and
we'll pass in Pause.
5:29
And below this comment we'll type
mMainActivity dot changePlayButtonText and
5:37
pass in Play.
5:43
All right,
we're done with our activity handler and
5:46
it's time to finish up in main activity.
5:49
First, let's get rid of everything in red.
5:52
So everything below mBound and
on service connected, and
5:56
everything except our call to start
service inside the mBound if statement And
6:00
our play buttons OnClickListener And
6:06
then I'll highlight the call
to startService and
6:15
use shift tab to align it.
6:19
Then let's create a new field for
the messenger we receive from our service.
6:23
And let's call it mServiceMessenger.
6:28
So right below where we
declare our play button,
6:32
private Messenger_mServiceMessenger;,
And Alt+Enter to import Messenger.
6:36
Next, inside onServiceConnected.
6:46
Let's set mServiceMessenger
equal to a new Messenger,
6:49
mServiceMessenger equals new Messenger and
let's pass in the binder parameter.
6:55
Then, we need to send a message to our
service to see if music is playing, so
7:04
we can update the UI accordingly.
7:09
Let's create a new message.
7:12
Message message = Message.obtain and
7:13
give it an arg1 of 2 to signify
is playing message.arg1 = 2.
7:20
And if we want to hear back,
7:27
we need to provide our own messenger
as the reply to parameter.
7:29
Let's create a new field for
our activities own messenger and
7:34
name it mActivityMessenger.
7:39
Private Messenger mActivityMessenger and
7:41
say = new Messenger().
7:47
Then let's pass in a new instance of
our activity handler as a parameter.
7:53
And that activity handler then requires
an instance of main activity which we can
8:00
pass in using the this keyword and
add a semi colon.
8:05
Then let's set the reply to of our
message to be our new ActivityMessenger.
8:08
Message.replyTo = mActivityMessenger;.
8:16
And let's use our services messenger
to send the message to our service.
8:22
mServiceMessenger.send and
pass in the message.
8:26
And use alt enter to handle the exception.
8:33
As the pen ultimate step,
let's copy all of this message code and
8:37
paste it into the void we
left in our on-click method.
8:41
If we run the app now, music will start
playing immediately because we don't have
8:53
a way to update our button's text
without playing or pausing music.
8:58
No matter how we get to the activity
handler, it's either going to play or
9:02
pause music.
9:07
To fix this,
let's pass in an extra argument when we
9:09
only want to update our play buttons
text and on service connected,
9:12
let's add another argument or
two and set it equal to one.
9:18
Message.arg 2 equals 1.
9:24
Then mplayer handler.
9:29
If we're inside the is playing case, and
the provided message has an arg2 of 1,
9:33
then let's also give our
new message an arg2 of 1.
9:38
So, right below where we set
arg1 to is playing, let's write,
9:43
if msg.arg2 == 1.
9:48
And if it does,
let's set message.arg2 = 1.
9:51
Finally, an activity handler we
need to handle when arg2 is one.
10:01
So if music is not playing and arg2 is
one, which means we're only concerned
10:08
with the button being labeled correctly,
we should change the button to say Play.
10:13
Otherwise, we should keep
doing the same thing.
10:19
So below the music is not playing comment.
10:23
Let's type if msg.arg2 -- 1.
10:26
And if it is we need to update
our play button to say play.
10:31
So mMainActivity.changePlayButtonText
10:36
to play, else we will keep doing
what we were doing before.
10:43
And for the second if statement,
if music is playing and
10:49
we're only concerned with updating
the button's text, then we should change
10:54
the button to say pause Else we
should keep doing the same thing.
10:57
So if message.org2
11:01
is one, then we'll change the play
button to say pause in main
11:07
activity that change play
button text to pause and
11:12
else we'll keep doing the same thing,
and there we go.
11:17
Now, let's test the app and
see if it works.
11:22
Play.
11:32
[MUSIC]
11:33
Pause play again, with the app,
and open the app again,
11:35
and it says pause,
because the music's still playing.
11:41
Awesome.
11:47
You need to sign up for Treehouse in order to download course files.
Sign upYou need to sign up for Treehouse in order to set up Workspace
Sign up