我的Android案例—MusicBox

来源:互联网 发布:默读知乎 编辑:程序博客网 时间:2024/05/29 06:55

2015年的Android案例之旅

案例五:MusicBox

涉及文件:

res->layout->activity_music_box.xml 布局文件

res->values->strings 资源文件之字符串资源

res->AndroidManifest.xml 系统清单文件

src->com.activity.musicbox.MusicBox.java java文件

src->com.service.musicbox.MusicService.java java文件

activity_music_box.xml
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"    android:layout_width="match_parent"    android:layout_height="match_parent"    android:orientation="vertical">         <!-- 文本控件 -->    <TextView         android:id="@+id/show"        android:layout_width="match_parent"        android:layout_height="wrap_content"        android:text="@string/hello_world"/>        <!-- 按钮控件    点击播放或暂停音乐 -->    <Button        android:id="@+id/play"        android:layout_width="match_parent"    android:layout_height="wrap_content"    android:text="@string/play"/>        <!-- 按钮控件    点击停止播放 -->    <Button        android:id="@+id/stop"        android:layout_width="match_parent"    android:layout_height="wrap_content"   android:text="@string/stop"/>    </LinearLayout>
strings
<?xml version="1.0" encoding="utf-8"?><resources>    <string name="app_name">MusicBox</string>    <string name="hello_world">音乐盒</string>    <string name="action_settings">Settings</string>    <string name="play">播放</string>    <string name="stop">停止</string></resources>
AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?><!-- 申明包名以及版本号 -->  <manifest xmlns:android="http://schemas.android.com/apk/res/android"    package="com.activity.musicbox"    android:versionCode="1"    android:versionName="1.0" ><!-- 申明程序兼容的最低版本 -->      <uses-sdk        android:minSdkVersion="14"        android:targetSdkVersion="19" /><!-- 包含那些组件 -->      <application        android:allowBackup="true"        android:icon="@drawable/ic_launcher"        android:label="@string/app_name"        android:theme="@style/AppTheme" >        <activity            android:name="com.activity.musicbox.MusicBox"            android:label="@string/app_name" >            <intent-filter>                <action android:name="android.intent.action.MAIN" />                <category android:name="android.intent.category.LAUNCHER" />            </intent-filter>        </activity>        <!-- 声明Service组件 -->        <service android:name="com.service.musicbox.MusicService">            <intent-filter>                <action android:name="com.service.musicbox"></action>            </intent-filter>        </service>    </application><!-- 添加对SD卡读写的权限 -->    <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/>    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/></manifest>

MusicBox.java
/** * @param 实现OnClickListener接口 *            统一管理OnClick事件 * @author Administrator *  */public class MusicBox extends Activity implements OnClickListener {// 定义Log标签private static final String TAG = "MUSICBOX";// 声明控件对象private Button play, stop;private TextView show;private MusicRecevier musicRecevier;//当前的状态 0x11:没有播放0x12:正在播放0x13:暂停int state = 0x11;//声明其它组件的Action//Service的Actionpublic static final String SERVICE_ACTION = "com.service.musicbox";//发送给Service的广播public static final String MYRECEIVER_ACTION = "com.broadcast.musibox.myreceiver";@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_music_box);Log.i(TAG, "MUSICBOX is onCreate");//获取布局控件init();musicRecevier = new MusicRecevier();//创建IntentFilterIntentFilter filter = new IntentFilter();//指定BroadCastRecevier监听的Actionfilter.addAction(MYRECEIVER_ACTION);//注册BroadCastRecevierregisterReceiver(musicRecevier, filter);//启动ServiceIntent intent = new Intent(SERVICE_ACTION);startService(intent);}@Overridepublic void onClick(View source) {//创建Intent对象,用于发送广播Intent intent = new Intent(MusicService.MUSICRECEIVER);switch(source.getId()){case R.id.play:intent.putExtra("control", 1);break;case R.id.stop:intent.putExtra("control", 2);break;default:break;}Log.i(TAG, "MUSICBOX is sendBroadcast");sendBroadcast(intent);}/** * @param接收MusicBox的广播 * @author Administrator * */public class MusicRecevier extends BroadcastReceiver{@Overridepublic void onReceive(Context context, Intent intent) {// 获取Intent中的update信息,updte代表播放状态int update = intent.getIntExtra("update", -1);//获取Intent中的current信息,current代表歌曲信息int current = intent.getIntExtra("current", -1);if(current >= 0){show.setText("new Music");}switch(update){case 0x11:show.setText("暂时没有歌曲播放");break;case 0x12:show.setText("歌曲正在播放");break;case 0x13:show.setText("歌曲播放暂停");break;default:break;}Log.i(TAG, "MUSICBOX is onReceive");}}/** * @param获取布局文件中的控件 */public void init(){play = (Button)this.findViewById(R.id.play);stop = (Button)this.findViewById(R.id.stop);play.setOnClickListener(this);stop.setOnClickListener(this);show = (TextView)this.findViewById(R.id.show);}}

MusicService.java
public class MusicService extends Service{//定义Log标签private static final String TAG="MusicService";//定义音乐播放器private MediaPlayer mMediaPlayer ;//当前的状态 0x11:没有播放0x12:正在播放0x13:暂停int state = 0x11;MyReceiver serviceReceiver;//定义MusicReceiver的Actionpublic static final String MUSICRECEIVER = "com.action.musicbox.musicreceiver";@Overridepublic IBinder onBind(Intent intent) {return null;}//Service创建时启动广播@Overridepublic void onCreate() {//创建BroadcastReceiverserviceReceiver = new MyReceiver();//创建IntentFilter注册该ReceiverIntentFilter filter = new IntentFilter();filter.addAction(MUSICRECEIVER);registerReceiver(serviceReceiver, filter);//创建MediaPlayermMediaPlayer = new MediaPlayer();//为mMediaPlayer播放完成事件绑定监听器mMediaPlayer.setOnCompletionListener(new OnCompletionListener() {@Overridepublic void onCompletion(MediaPlayer mp) {//发送广播通知MusicBox更改文本内容Intent intent = new Intent(MusicBox.MYRECEIVER_ACTION);intent.putExtra("current", "1");sendBroadcast(intent);}});super.onCreate();Log.i(TAG, "MusicService is oncreate");}/** * @param接收Service中的广播 * @author Administrator * */public class MyReceiver extends BroadcastReceiver{@Overridepublic void onReceive(Context context, Intent intent) {int control = intent.getIntExtra("control", -1);switch(control){//播放或暂停case 1://播放状态if(state == 0x11){//歌曲暂时先写死prepareAndPlay(null);//修改状态state = 0x12;}//原来处于播放状态则暂停else if(state == 0x12){//暂停mMediaPlayer.pause();//修改状态state = 0x13;}//原来处于暂停状态的else if(state == 0x13){//播放mMediaPlayer.start();//修改状态state = 0x12;}break;//停止case 2:if(state == 0x12 || state == 0x13){//停止播放mMediaPlayer.stop();//修改状态state = 0x11;}break;default:break;}//创建一个Intent对象Intent sendIntent = new Intent(MusicBox.MYRECEIVER_ACTION);sendIntent.putExtra("update", state);Log.i(TAG, "MusicService is sendBroadcast");//发送广播,将被MusicBox中的BroadCastRecevier接收到sendBroadcast(sendIntent);}}/** * @param播放指定的音乐 * @param music */private void prepareAndPlay(String music){try {mMediaPlayer.reset();//装载音乐暂时写死!!mMediaPlayer.setDataSource("/mnt/sdcard/001.mp3");mMediaPlayer.prepare();//开始播放音乐mMediaPlayer.start();} catch (Exception e) {// TODO: handle exception}Log.i(TAG, "MusicService is prepareAndPlay");}}

总结

一个简单的音乐播放器,把Activity,Service,BroadCastRecevier结合使用了一下,感觉到了一点点的压力,不论是代码量还是业务逻辑。
发现在敲代码前一定要想好写什么,为什么这么写,怎么写会更好。。。加油吧~~
PS:原本下午就应该敲完,测试完并上传到博客中。。。可是今天是周末~
适当的放松有益身心健康。


0 0
原创粉丝点击