之前贴的在activity中写小音乐播放程序,可以直接的感受到怎么更好的使用activity生命周期
譬如我想到一个需求,就是接电话,或者用户不小心按到home键,怎么回来音乐还能继续播放?
就使用到onpause和onresume方法,在pause中把要保存的数据记录下来,在通过onSaveInstanceState和onRestoreInstanceState给
传递给之前的状态。
还有这个播放器没法脱离activity还能继续播放,该怎么办?
播放器的音乐搜寻没有选择,怎么才能搜索到有MP3格式的音乐?
网络音乐api怎么调用?
App怎么才能跟上最新的material design设计思想?
现在贴上加入service和broadcast的
public class MainActivity extends Activity implements OnClickListener,
OnItemClickListener {
ListView lv;
RelativeLayout rLayout;
Button forwButton;
Button nextButton;
Button stopButton;
MediaPlayer mediaPlayer = new MediaPlayer();
ArrayList<Music> musicList = new ArrayList<Music>();
MusicApplication musicApplication;
public static final String CTL_ACTION = "com.wyx.action.ctl_action";
Intent intent = new Intent(CTL_ACTION);
// public static final String UPDATE_ACTION="com.wyx.action.update_action";
// ActivityReceiver activityReceiver;
// 当前点击音乐内容的时间轴位置
// int music_content_postion;
// 当前点击音乐的位置
int music_postion;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_NO_TITLE);
setContentView(R.layout.activity_main);
initView();
putMusicToList();
setMusicListToAdapter();
}
// public class ActivityReceiver extends BroadcastReceiver{
//
// @Override
// public void onReceive(Context context, Intent intent) {
//
// }
//
// }
// // 当当前activity状态破坏时保存变量,以便恢复时使用
// @Override
// protected void onSaveInstanceState(Bundle outState) {
// super.onSaveInstanceState(outState);
// outState.putInt("music_postion", music_postion);
// outState.putInt("music_content_postion", music_content_postion);
// }
//
// // 以便恢复时使用
// @Override
// protected void onRestoreInstanceState(Bundle savedInstanceState) {
// super.onRestoreInstanceState(savedInstanceState);
// this.music_postion = savedInstanceState.getInt("music_postion");
// this.music_content_postion = savedInstanceState
// .getInt("music_content_postion");
// }
// @Override
// protected void onPause() {
// super.onPause();
// if (mediaPlayer.isPlaying()) {
// music_content_postion = mediaPlayer.getCurrentPosition();
// mediaPlayer.stop();
// }
//
// }
//
// @Override
// protected void onResume() {
// super.onResume();
// if (music_content_postion > 0) {
// if (music_postion == 0) {
// startMediaPlayer(1);
// } else {
// startMediaPlayer(music_postion);
// mediaPlayer.seekTo(music_content_postion);
// music_content_postion = 0;
// }
//
// }
// }
//
// @Override
// protected void onDestroy() {
// super.onDestroy();
// mediaPlayer.release();
// }
private void initView() {
lv = (ListView) findViewById(R.id.listView_show_music);
forwButton = (Button) findViewById(R.id.button_forward);
nextButton = (Button) findViewById(R.id.button_next);
stopButton = (Button) findViewById(R.id.button_show_music);
rLayout = (RelativeLayout) findViewById(R.id.con_music);
musicApplication = (MusicApplication) getApplication();
forwButton.setOnClickListener(this);
nextButton.setOnClickListener(this);
stopButton.setOnClickListener(this);
lv.setOnItemClickListener(this);
// activityReceiver=new ActivityReceiver();
// IntentFilter intentFilter=new IntentFilter();
// intentFilter.addAction(UPDATE_ACTION);
// registerReceiver(activityReceiver, intentFilter);
}
private void putMusicToList() {
// 用contentresolver获得音乐
Cursor cursor = getContentResolver().query(
MediaStore.Audio.Media.EXTERNAL_CONTENT_URI, null, null, null,
null);
while (cursor.moveToNext()) {
Music music = new Music();
String musicName = cursor.getString(cursor
.getColumnIndex(Media.DISPLAY_NAME));
music.setMusic_name(musicName);
byte[] musicPath = cursor
.getBlob(cursor.getColumnIndex(Media.DATA));
music.setMusic_path(new String(musicPath, 0, musicPath.length - 1));
String musicAut = cursor.getString(cursor
.getColumnIndex(Media.ARTIST));
music.setMusic_author(musicAut);
musicList.add(music);
}
musicApplication.setMusicList(musicList);
}
private void setMusicListToAdapter() {
List<Map<String, Object>> listitems = new ArrayList<Map<String, Object>>();
for (int i = 0; i < musicList.size(); i++) {
Map<String, Object> item = new HashMap<String, Object>();
item.put("name", musicList.get(i).getMusic_name());
item.put("author", musicList.get(i).getMusic_author());
listitems.add(item);
}
SimpleAdapter simpleAdapter = new SimpleAdapter(this, listitems,
R.layout.line, new String[] { "name", "author" }, new int[] {
R.id.textView_name, R.id.textView_author });
lv.setAdapter(simpleAdapter);
}
@Override
public void onItemClick(AdapterView<?> parent, View view, int position,
long id) {
rLayout.setVisibility(View.VISIBLE);
Intent startServiceIntent = new Intent(this, MusicService.class);
music_postion = position;
startServiceIntent.putExtra("position", music_postion);
startService(startServiceIntent);
}
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.button_forward:
intent.putExtra("control", 1);
break;
case R.id.button_show_music:
intent.putExtra("control", 2);
break;
case R.id.button_next:
intent.putExtra("control", 3);
break;
default:
break;
}
sendBroadcast(intent);
}
}
public class MusicApplication extends Application {
ArrayList<Music> musicList = new ArrayList<Music>();
public ArrayList<Music> getMusicList() {
return musicList;
}
public void setMusicList(ArrayList<Music> musicList) {
this.musicList = musicList;
}
@Override
public void onCreate() {
super.onCreate();
}
}
public class MusicService extends Service {
MediaPlayer mediaPlayer = new MediaPlayer();;
ServiceReceiver serviceReceiver;
// 当前点击音乐的位置
int music_postion;
MusicApplication musicApplication;
ArrayList<Music> musicList = new ArrayList<Music>();
@Override
public IBinder onBind(Intent intent) {
return null;
}
@Override
public void onCreate() {
musicApplication=(MusicApplication) getApplication();
musicList = musicApplication.getMusicList();
Log.v("wyx", String.valueOf(musicList.get(0).getMusic_author()));
Log.v("wyx", String.valueOf(music_postion));
serviceReceiver = new ServiceReceiver();
IntentFilter intentFilter = new IntentFilter();
intentFilter.addAction(MainActivity.CTL_ACTION);
registerReceiver(serviceReceiver, intentFilter);
mediaPlayer.setOnCompletionListener(new OnCompletionListener() {
@Override
public void onCompletion(MediaPlayer arg0) {
// TODO Auto-generated method stub
}
});
super.onCreate();
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
music_postion=intent.getIntExtra("position",0);
startMediaPlayer(music_postion);
return super.onStartCommand(intent, flags, startId);
}
public class ServiceReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
int control = intent.getIntExtra("control", -1);
switch (control) {
case 1:
if (music_postion == 0) {
music_postion = musicList.size() - 1;
startMediaPlayer(musicList.size() - 1);
} else {
music_postion = music_postion - 1;
startMediaPlayer(music_postion);
}
break;
case 2:
if (mediaPlayer.isPlaying()) {
mediaPlayer.pause();
// button.setText("Start");
} else {
mediaPlayer.start();
// button.setText("Stop");
}
break;
case 3:
if (music_postion == musicList.size() - 1) {
music_postion = 0;
startMediaPlayer(music_postion);
} else {
music_postion = music_postion + 1;
startMediaPlayer(music_postion);
}
break;
default:
break;
}
}
}
@Override
public void onDestroy() {
super.onDestroy();
}
private void startMediaPlayer(int position) {
try {
if (mediaPlayer.isPlaying()) {
mediaPlayer.stop();
}
mediaPlayer.reset();
mediaPlayer.setDataSource(musicList.get(position).getMusic_path());
mediaPlayer.prepare();
mediaPlayer.start();
} catch (IOException e) {
e.printStackTrace();
}
}
}