long id) {
if(mp3Infos != null) {
Mp3Info mp3Info = mp3Infos.get(position);
Log.d(“mp3Info–>”, mp3Info.toString());
Intent intent = new Intent();
intent.putExtra(“url”, mp3Info.getUrl());
intent.putExtra(“MSG”, AppConstant.PlayerMsg.PLAY_MSG);
intent.setClass(MainActivity.this, PlayerService.class);
startService(intent); //启动服务
}
}
}
3. 定义一个继承Service的服务类PlayerServie(未完善的Service类)
package com.wwj.sb.service;
import android.annotation.SuppressLint;
import android.app.Service;
import android.content.Intent;
import android.media.MediaPlayer;
import android.media.MediaPlayer.OnPreparedListener;
import android.os.IBinder;
import com.wwj.sb.domain.AppConstant;
@SuppressLint(“NewApi”)
public class PlayerService extends Service {
private MediaPlayer mediaPlayer = new MediaPlayer(); //媒体播放器对象
private String path; //音乐文件路径
private boolean isPause; //暂停状态
@Override
public IBinder onBind(Intent arg0) {
return null;
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
if(mediaPlayer.isPlaying()) {
stop();
}
path = intent.getStringExtra(“url”);
int msg = intent.getIntExtra(“MSG”, 0);
if(msg == AppConstant.PlayerMsg.PLAY_MSG) {
play(0);
} else if(msg == AppConstant.PlayerMsg.PAUSE_MSG) {
pause();
} else if(msg == AppConstant
.PlayerMsg.STOP_MSG) {
stop();
}
return super.onStartCommand(intent, flags, startId);
}
/**
播放音乐
@param position
*/
private void play(int position) {
try {
mediaPlayer.reset();//把各项参数恢复到初始状态
mediaPlayer.setDataSource(path);
mediaPlayer.prepare(); //进行缓冲
mediaPlayer.setOnPreparedListener(new PreparedListener(position));//注册一个监听器
}
catch (Exception e) {
e.printStackTrace();
}
}
/**
*/
private void pause() {
if (mediaPlayer != null && mediaPlayer.isPlaying()) {
mediaPlayer.pause();
isPause = true;
}
}
/**
*/
private void stop(){
if(mediaPlayer != null) {
mediaPlayer.stop();
try {
mediaPlayer.prepare(); // 在调用stop后如果需要再次通过start进行播放,需要之前调用prepare函数
} catch (Exception e) {
e.printStackTrace();
}
}
}
@Override
public void onDestroy() {
if(mediaPlayer != null){
mediaPlayer.stop();
mediaPlayer.release();
}
}
/**
实现一个OnPrepareLister接口,当音乐准备好的时候开始播放
*/
private final class PreparedListener implements OnPreparedListener {
private int positon;
public PreparedListener(int positon) {
this.positon = positon;
}
@Override
public void onPrepared(MediaPlayer mp) {
mediaPlayer.start(); //开始播放
if(positon > 0) { //如果音乐不是从头播放
mediaPlayer.seekTo(positon);
}
}
}
其实要轻松掌握很简单,要点就两个:
你不需要是天才,也不需要具备强悍的天赋,只要做到这两点,短期内成功的概率是非常高的。
对于很多初中级Android工程师而言,想要提升技能,往往是自己摸索成长,不成体系的学习效果低效漫长且无助。
以上就是总结的关于在面试的一些总结,希望对大家能有些帮助,除了这些面试中需要注意的问题,当然最重要的就是刷题了,这里放上我之前整理的一份超全的面试专题PDF
还有 高级架构技术进阶脑图、Android开发面试专题资料,高级进阶架构资料 帮助大家学习提升进阶,也节省大家在网上搜索资料的时间来学习,也可以分享给身边好友一起学习。
【Android核心高级技术PDF文档,BAT大厂面试真题解析】
这里只是整理出来的部分面试题,后续会持续更新,希望通过这些高级面试题能够降低面试Android岗位的门槛,让更多的Android工程师理解Android系统,掌握Android系统。喜欢的话麻烦点击一个喜欢在关注一下~
高级架构技术进阶脑图、Android开发面试专题资料*,高级进阶架构资料 帮助大家学习提升进阶,也节省大家在网上搜索资料的时间来学习,也可以分享给身边好友一起学习。
【Android核心高级技术PDF文档,BAT大厂面试真题解析】
[外链图片转存中…(img-DqfkyUgY-1647756301384)]
这里只是整理出来的部分面试题,后续会持续更新,希望通过这些高级面试题能够降低面试Android岗位的门槛,让更多的Android工程师理解Android系统,掌握Android系统。喜欢的话麻烦点击一个喜欢在关注一下~