目录

  • 1 第一周 android简介
    • 1.1 第一课 Android基础入门1
    • 1.2 第二课 Android基础入门2
    • 1.3 第三课 Android UI开发介绍
  • 2 第二周 android布局
    • 2.1 第一课 Android 布局文件介绍1
    • 2.2 第二课 Android 布局文件介绍2
    • 2.3 第三课 Android 布局文件介绍3
  • 3 第三周 Android UI组件开发
    • 3.1 第一课 Button和ImageButton
    • 3.2 第二课 TextView和EditText
    • 3.3 第三课 RadioButton和CheckBox
  • 4 第四周 Android UI组件开发
    • 4.1 第一课 Spinner和ListView
    • 4.2 第二课 应用案例-手机信息页面
    • 4.3 第三课 Android生命周期
  • 5 第五周 Android组件通信
    • 5.1 第一课 Intent的介绍
    • 5.2 第二课 Intent实现各种系统功能
    • 5.3 第三课 应用案例-手机注册页面
  • 6 第六周 数据存储
    • 6.1 第一课 应用案例-新建联系人
    • 6.2 第二课 数据存储-简单文件存储
    • 6.3 第三课 SharedPreferences存储
  • 7 第七周 数据存储
    • 7.1 第一课 xml文件存储
    • 7.2 第二课 应用案例-植物百科
    • 7.3 第三课  ListView 组件高级使用
  • 8 第八周 SQLite数据库
    • 8.1 第一课 应用案例-应用列表
    • 8.2 第二课 使用SQLite数据库存储(创建数据库和表)
    • 8.3 第三课 使用SQLite数据库存储(对表数据操作)
  • 9 第九周 项目实战-商品购物车处理
    • 9.1 第一课 使用SQLite数据库存储(对表数据查询)
    • 9.2 第二课 商品购物车处理(布局)
    • 9.3 第三课 商品购物车处理(数据处理)
  • 10 第十周 内容提供者及广播
    • 10.1 第一课 内容提供者的使用
    • 10.2 第二课 广播概念以及如何使用
    • 10.3 第三课 自定义广播
  • 11 第十一周 广播和服务
    • 11.1 第一课 应用案例-电池电量
    • 11.2 第二课 应用案例-通话记录
    • 11.3 第三课 服务简介
  • 12 第十二周 服务应用
    • 12.1 第一课 应用案例—音乐播放器
    • 12.2 第二课 应用案例—地震监测
    • 12.3 第三课 获得手机SIM卡信息
  • 13 第十三周 网络编程
    • 13.1 第一课 网络编程入门
    • 13.2 第二课 使用HttpClient访问网络
    • 13.3 第三课 webview组件
  • 14 第十四周 网络编程应用案例
    • 14.1 第一课 消息机制简介
    • 14.2 第二课 应用案例-应用升级
    • 14.3 第三课 应用案例-应用升级
第一课 应用案例—音乐播放器

一、案例——音乐播放器

在生活中经常会用到服务,为了让大家更好的理解服务通信,接下来通过一个音乐播放器的案例来演示如何使用服务进行通信。



布局文件:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"

    xmlns:tools="http://schemas.android.com/tools"

    android:layout_width="match_parent"

    android:layout_height="match_parent"

    android:background="@android:color/white"

    android:orientation="vertical" >

    <EditText

        android:id="@+id/et_inputpath"

        android:layout_width="match_parent"

        android:layout_height="wrap_content"

        android:text="a.mp3"/>

    <SeekBar

        android:id="@+id/seekBar1"

        android:layout_width="match_parent"

        android:layout_height="wrap_content"

        android:layout_marginBottom="10dp"

        android:layout_marginTop="20dp" />

    <LinearLayout

        android:layout_width="match_parent"

        android:layout_height="wrap_content"

        android:orientation="horizontal"

        android:layout_gravity="center_horizontal" 

        android:gravity="center">

        <TextView

            android:id="@+id/bt_play"

            android:layout_width="0dp"

            android:layout_weight="1"

            android:layout_height="wrap_content"

            android:text="播放" 

            android:gravity="center"

            android:drawableTop="@android:drawable/ic_media_play"

            android:drawablePadding="3dp"/>

        <TextView

            android:id="@+id/bt_pause"

            android:layout_width="0dp"

            android:layout_weight="1"

            android:layout_height="wrap_content"

            android:drawableTop="@android:drawable/ic_media_pause"

            android:drawablePadding="3dp"

            android:gravity="center"

            android:text="暂停" />

        <TextView

            android:id="@+id/bt_replay"

           android:layout_width="0dp"

            android:layout_weight="1"

            android:layout_height="wrap_content"

             android:drawableTop="@android:drawable/ic_media_play"

            android:drawablePadding="3dp"

            android:gravity="center"

            android:text="重播" />

        <TextView

            android:id="@+id/bt_stop"

            android:layout_width="0dp"

            android:layout_weight="1"

            android:layout_height="wrap_content"

            android:drawablePadding="3dp"

            android:drawableTop="@android:drawable/ic_media_pause"

            android:gravity="center"

            android:text="停止" />

    </LinearLayout>

</LinearLayout>


MusicService.java 

public class MusicService extends Service {

private static final String TAG = "MusicService";

public MediaPlayer mediaPlayer;

class MyBinder extends Binder {

// 播放音乐

public void plays(String path) {

play(path);

}

// 暂停播放

public void pauses() {

pause();

}

// 重新播放

public void replays(String path) {

replay(path);

}

// 停止播放

public void stops() {

stop();

}

// 获取当前播放进度

public int getCurrentPosition() {

return getCurrentProgress();

}

// 获取音乐文件的长度

public int getMusicWidth() {

return getMusicLength();

}

}

public void onCreate() {

super.onCreate();

}

// 播放音乐

@SuppressLint("NewApi")

public void play(String path) {

try {

if (mediaPlayer == null) {

Log.i(TAG, "开始播放音乐");

// 创建一个MediaPlayer播放器

mediaPlayer = new MediaPlayer();

// 指定参数为音频文件

mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);

// 指定播放的路径

mediaPlayer.setDataSource(path);

// 准备播放

mediaPlayer.prepare();

mediaPlayer.setOnPreparedListener(new OnPreparedListener() {

@Override

public void onPrepared(MediaPlayer mp) {

// TODO Auto-generated method stub

// 开始播放

mediaPlayer.start();

}

});

} else {

int position = getCurrentProgress();

mediaPlayer.seekTo(position);

try {

mediaPlayer.prepare();

} catch (Exception e) {

e.printStackTrace();

}

mediaPlayer.start();

}

} catch (Exception e) {

e.printStackTrace();

}

}

// 暂停音乐

public void pause() {

if (mediaPlayer != null && mediaPlayer.isPlaying()) {

Log.i(TAG, "播放暂停");

mediaPlayer.pause(); // 暂停播放

} else if (mediaPlayer != null && (!mediaPlayer.isPlaying())) {

mediaPlayer.start();

}

}

// 重新播放音乐

public void replay(String path) {

if (mediaPlayer != null) {

Log.i(TAG, "重新开始播放");

mediaPlayer.seekTo(0);

try {

mediaPlayer.prepare();

} catch (IllegalStateException e) {

e.printStackTrace();

} catch (IOException e) {

e.printStackTrace();

}

mediaPlayer.start();

}

}

// 停止音乐

public void stop() {

if (mediaPlayer != null) {

Log.i(TAG, "停止播放");

mediaPlayer.stop();

mediaPlayer.release();

mediaPlayer = null;

} else {

Toast.makeText(getApplicationContext(), "已停止", 0).show();

}

}


// 获取资源文件的长度

public int getMusicLength() {

if (mediaPlayer != null) {

return mediaPlayer.getDuration();

}

return 0;

}

// 获取当前进度

public int getCurrentProgress() {

if (mediaPlayer != null & mediaPlayer.isPlaying()) {

Log.i(TAG, "获取当前进度");

return mediaPlayer.getCurrentPosition();

} else if (mediaPlayer != null & (!mediaPlayer.isPlaying())) {

return mediaPlayer.getCurrentPosition();

}

return 0;

}

public void onDestroy() {

if (mediaPlayer != null) {

mediaPlayer.stop();

mediaPlayer.release();

mediaPlayer = null;

}

super.onDestroy();

}

public IBinder onBind(Intent intent) {

// 第一步执行onBind方法

return new MyBinder();

}

}


MainActivity.java

public class MainActivity extends Activity implements OnClickListener {

private EditText path;

private Intent intent;

private myConn conn;

MyBinder binder;

private SeekBar mSeekBar;

private Handler handler = new Handler() {

public void handleMessage(android.os.Message msg) {

switch (msg.what) {

case 100:

int currentPosition = (Integer) msg.obj;

mSeekBar.setProgress(currentPosition);

break;

default:

break;

}

};

};

private Thread mThread;

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

path = (EditText) findViewById(R.id.et_inputpath);

findViewById(R.id.bt_play).setOnClickListener(this);

findViewById(R.id.bt_pause).setOnClickListener(this);

findViewById(R.id.bt_replay).setOnClickListener(this);

findViewById(R.id.bt_stop).setOnClickListener(this);

mSeekBar = (SeekBar) findViewById(R.id.seekBar1);

conn = new myConn();

intent = new Intent(this, MusicService.class);

bindService(intent, conn, BIND_AUTO_CREATE);

}

// 初始化进度条的长度,获取音乐文件的长度

private void initSeekBar() {

// TODO Auto-generated method stub

int musicWidth = binder.getMusicWidth();

mSeekBar.setMax(musicWidth);

}

// 更新音乐播放的进度

private void UpdateProgress() {

mThread = new Thread() {

public void run() {

while (!interrupted()) {

// 调用服务中的获取当前播放进度

int currentPosition = binder.getCurrentPosition();

Message message = Message.obtain();

message.obj = currentPosition;

message.what = 100;

handler.sendMessage(message);

}

};

};

mThread.start();

}

private class myConn implements ServiceConnection {

public void onServiceConnected(ComponentName name, IBinder service) {

binder = (MyBinder) service;

}

public void onServiceDisconnected(ComponentName name) {

}

}

public void onClick(View v) {

String pathway = path.getText().toString().trim();

File SDpath = Environment.getExternalStorageDirectory();

File file = new File(SDpath, pathway);

String path = file.getAbsolutePath();

switch (v.getId()) {

case R.id.bt_play:

if (file.exists() && file.length() > 0) {

binder.plays(path);

initSeekBar();

UpdateProgress();

}else{

Toast.makeText(this, "找不到音乐文件", 0).show();

}

break;

case R.id.bt_pause:

binder.pauses();

break;

case R.id.bt_replay:

binder.replays(pathway);

break;

case R.id.bt_stop:

// 停止音乐之前首先要退出子线程

mThread.interrupt();

if (mThread.isInterrupted()) {

binder.stops();

}

break;

default:

break;

}

}

protected void onDestroy() {

// 如果线程没有退出,则退出

if (mThread != null & !mThread.isInterrupted()) {

mThread.interrupt();

}

unbindService(conn);

super.onDestroy();

}

}