android-简单音乐播放器的总结
[java]
业务:android的程序,实现播放音乐的功能。
知识点:
1.使用了android的四大组件中的三个(Activity,Service,Broadcast)
activity与serivice之间的通信用广播Broadcast组件实现,程序中有10多个广播的发布和接收。
2.还使用了线程和Application类来保存全局性的数据。
在Service中启动一个线程是为了在activity需要的时候,不间断地给activity发布更新进度的广播,activity收到后再界面上展示出来。
难点:
个人感觉广播虽然多,但是逻辑上一般,不是很复杂,稍微比较难理解的是线程的启动和停止条件的判段和service中Destroy方法中的收尾清理工作。
1.在这几种条件下需要唤醒线程。
1)play()方法中,当开始播放音乐的时候,让它就开始干活。
2)seekto()方法中,当拖动seekBar需要重新定位并且播放音乐的时候,让它就开始干活。
3)当activity发布广播,请求service发布一个更新进度的广播的时候需要唤醒线程,让它就开始干活。
4)Service方法要退出销毁的时候需要唤醒线程,让其退出循环。
完整项目代码:
部分代码:
主Activity的全部代码
[java] package com.tarena.day1901;
import com.tarena.entity.Music;
import com.tarena.utils.Consts;
import com.tarena.utils.FormatUtils;
import android.app.Activity;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.os.Bundle;
import android.util.Log;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
import android.widget.Button;
import android.widget.ListView;
import android.widget.SeekBar;
import android.widget.SeekBar.OnSeekBarChangeListener;
import android.widget.TextView;
public class MainActivity extends Activity {
private ListView lvMusics;
private MenuInflater inflater;
private MusicAdapter adapter;
private Button btnPlayOrPause;
private MusicApplication app;
private TextView tvMusicName;
private TextView tvDuration;
private InnerBroadcastReceiver receiver;
private SeekBar sbProgress;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
inflater=getMenuInflater();
app=(MusicApplication)getApplication();
//设置界面
setupView();
addlistener();
//启动service
Intent intent=new Intent(this, MusicService.class);
startService(intent);
//创建一个广播接收器
createReceiver();
}
//activity启动,发送广播给service告知需要发送进度更新的广播
@Override
protected void onStart() {
super.onStart();
Intent intent=new Intent(Consts.ACTION_NEED_UPDATE_PROGRESS);
intent.putExtra(Consts.EXTRA_NEED_UPDATE_PROGRESS, true);
sendBroadcast(intent);
Log.i("info", "onStart");
}
@Override
protected void onResume() {
Log.i("info", "onREsume");
super.onResume();
}
//activity停止,发送广播给service告知可以停止发送进度更新的广播
@Override
protected void onStop() {
super.onStop();
Intent intent=new Intent(Consts.ACTION_NEED_UPDATE_PROGRESS);
intent.putExtra(Consts.EXTRA_NEED_UPDATE_PROGRESS, false);
sendBroadcast(intent);
}
@Override
protected void onDestroy() {
super.onDestroy();
unregisterReceiver(receiver);//MainActivity销毁的时候,对广播接收器,解除注册
}
//设置界面
public void setupView(){
lvMusics=(ListView)findViewById(R.id.lvMusics);
adapter=new MusicAdapter(this);
lvMusics.setAdapter(adapter);
btnPlayOrPause=(Button)findViewById(R.id.btnPlayOrPause);
tvMusicName=(TextView)findViewById(R.id.tvMusicName);
tvDuration=(TextView)findViewById(R.id.tvDuration);
sbProgress=(SeekBar)findViewById(R.id.sbProgress);
}
//添加菜单
@Override
public boolean onCreateOptionsMenu(Menu menu) {
inflater.inflate(R.menu.opts,menu);
return super.onCreateOptionsMenu(menu);
}
//选择系统菜单选项,发送广播
@Override
public boolean onOptionsItemSelected(MenuItem item) {
Intent intent=null;
switch (item.getItemId()) {
case R.id.menu_sub_loop:
intent=new Intent(Consts.ACTION_PLAY_MODE);
intent.putExtra(Consts.EXTRA_PLAY_MODE, Consts.PLAY_MODE_LOOP);
sendBroadcast(intent
补充:移动开发 , Android ,