学习Android有一段时间了,接下来的这段时间想选择一个代码量较小但质量高的开源App进行学习。最终选择了UniversalMusicPlayer。
首先,把几张App截图贴上来。。
接下来,就要开始学习代码了。
工程下的代码学习
源码下载地址:http://download.csdn.net/detail/sinat_24495381/9540997
程序的包结构
首先,找到了程序的入口Activity—-MusicPlayerActivity, 来看它的描述。
/**
* Main activity for the music player.
* This class hold the MediaBrowser and the MediaController instances. It will create a MediaBrowser
* when it is created and connect/disconnect on start/stop. Thus, a MediaBrowser will be always
* connected while this activity is running.
*/
看这句话It will create a MediaBrowser when it is created and connect/disconnect on start/stop但是,我们发现,这个Activity中并没有Override onStart()函数,其实,它是继承了BaseActivity,在BaseActivity的onStart()函数中创建了MediaBrowser。
从上面的描述中,我们知道,MusicPlayerActivity会持有MediaBrowser 和 MediaController 两个类的实例(注:为了兼容低版本的android系统,此时,MusicplayerActivity持有的是v4包的MediaBrowserCompat 和 MediaControllerCompat的实例)。那么它们是什么呢?
## MediaBrowserCompat##
android.support.v4.media.MediaBrowserCompat;
Browses media content offered by a {@link MediaBrowserServiceCompat}. 浏览MediaBrowserServiceCompat提供的media内容。 MediaBrowserServiceCompat稍后讨论。
## MediaControllerCompat##
android.support.v4.media.session.MediaControllerCompat
/**
* Allows an app to interact with an ongoing media session. Media buttons and
* other commands can be sent to the session. A callback may be registered to
* receive updates from the session, such as metadata and play state changes.
* <p>
* A MediaController can be created if you have a {@link MediaSessionCompat.Token}
* from the session owner.
* <p>
* MediaController objects are thread-safe.
它是用来和正在进行的MediaSession进行互动的。它可以发送命令给MediaSession,还可以注册一个callback来接收来自MediaSession的更新。 另外, MediaControllerCompat的创建是需要 MediaSession.Token对象的。
这是一个关于MediaSession的介绍,可以先有个大体的印象:http://www.oschina.net/question/2561862_2150611?fromerr=RK8zJQV6