2.2我们需要做的是:
在main.xml设置页面的布局
在string.xml里定义我们会用到的文本类型的数据(如按钮上的显示的字)
在src下的java文件里写业务逻辑,android里的就是一个activity到另一个activity,但是,简单的就是一个activity实习的
每个activity都有自己的生命周期,每个生命周期会触发不同的方法。
#############################
下面是main.xml的数据
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical" >
<TextView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="@string/filename" />
<EditText
android:id="@+id/filename"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="Lindsey Ray - Better Off.mp3" />
<LinearLayout
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:orientation="horizontal" >
<Button
android:id="@+id/button_play"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/button_play" />
<Button
android:id="@+id/button_pause"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/button_pause" />
<Button
android:id="@+id/button_reset"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/button_reset" />
<Button
android:id="@+id/button_stop"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/button_stop" />
</LinearLayout>
</LinearLayout>
#############################
下面是string.xml的数据
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="hello">Hello World, MainActivity!</string>
<string name="app_name">AudioPlayer</string>
<string name="filename">请输入音乐文件名:</string>
<string name="filenoexist">音乐文件不存在</string>
<string name="button_play">播放</string>
<string name="button_pause">暂停</string>
<string name="button_continue">继续</string>
<string name="button_reset">重播</string>
<string name="button_stop">停止</string>
</resources>
最后是音乐播放器的代码:
package mymusicplay.aubergine;
import java.io.File;
import android.app.Activity;
import android.media.MediaPlayer;
import android.media.MediaPlayer.OnPreparedListener;
import android.os.Bundle;
import android.os.Environment;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;
public class MyMusicPlayerActivity extends Activity {
private EditText filenameText;
private MediaPlayer mediaPlayer;
private String path;
private boolean pause;
private int position;
@Override
public void onCreate(Bundle savedInstanceState) {
// 程序自动生成
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
// 获得activity中的对象
filenameText = (EditText) this.findViewById(R.id.filename);
Button playButton = (Button) this.findViewById(R.id.button_play);
Button pauseButton = (Button) this.findViewById(R.id.button_pause);
Button resetButton = (Button) this.findViewById(R.id.button_reset);
Button stopButton = (Button) this.findViewById(R.id.button_stop);
// 创建音乐播放器
mediaPlayer = new MediaPlayer();
// 创建按钮点击事件的监听
ButtonClickListener listener = new ButtonClickListener();
// 将监听事件放上去
playButton.setOnClickListener(listener);
pauseButton.setOnClickListener(listener);
resetButton.setOnClickListener(listener);
stopButton.setOnClickListener(listener);
}
/**
* 当播放器处于后台时会触发此生命周期方法
*/
@Override
protected void onPause() {
if (mediaPlayer.isPlaying()) {
position = mediaPlayer.getCurrentPosition();// 记录当前音乐播放器播放到的位置
mediaPlayer.stop();// 停止播放(其实是暂停)
}
super.onPause();
}
/**
* 当播放器重新回到前台时会触发此生命周期方法
*/
@Override
protected void onResume() {
if (path != null && position > 0) {
play(position);// 从暂停的位置开始接着播放
position = 0;// 并将位置设置为开始
}
super.onResume();
}
/**
* 当播放器关闭时触发此生命周期方法
*/
@Override
protected void onDestroy() {
// 释放资源
mediaPlayer.release();
super.onDestroy();
}
private final class ButtonClickListener implements OnClickListener {
// 需要覆盖的方法
public void onClick(View v) {
switch (v.getId()) {
// 播放按钮
case R.id.button_play:
String filename = filenameText.getText().toString();
File file = new File(Environment.getExternalStorageDirectory(),
filename);// 正在播放的音乐文件
if (file.exists()) {
path = file.getAbsolutePath();
play(0);
} else {
path = null;
Toast.makeText(getApplicationContext(),
R.string.filenoexist, Toast.LENGTH_LONG).show();
}
break;
case R.id.button_pause:
if (mediaPlayer.isPlaying()) {
mediaPlayer.pause();
((Button) v).setText(R.string.button_continue);
pause = true;
} else {
((Button) v).setText(R.string.button_pause);
if (pause) {
mediaPlayer.start();
pause = false;
}
}
break;
case R.id.button_reset:
if (mediaPlayer.isPlaying()) {
mediaPlayer.seekTo(0);
} else {
if (path != null) {
play(0);
}
}
break;
case R.id.button_stop:
if (mediaPlayer.isPlaying()) {
mediaPlayer.stop();
}
break;
}
}
}
/**
* 播放音乐
*
* @param pos
*/
public void play(int pos) {
try {
mediaPlayer.reset();
mediaPlayer.setDataSource(path);
mediaPlayer.setOnPreparedListener(new PreparedListener(pos));
mediaPlayer.prepare();
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 监听音乐文件缓冲完成的监听
*
* @author k
*
*/
private final class PreparedListener implements OnPreparedListener {
private int pos;
public PreparedListener(int pos) {
this.pos = pos;
}
public void onPrepared(MediaPlayer mp) {
mediaPlayer.start(); // 开始播放音乐
if (pos > 0) {
mediaPlayer.seekTo(pos);
}
}
}
}
注意:
这样我们在工程上选择=》run android application就会将我们的工程部署上去,然后,
弹出界面,在点击主菜单在主菜单就看到了我们的应用名称为“AudioPlayer”的应用图标,上面的string.xml中的appname可以配置其他名称。
相关推荐
Android深入理解Activity,源于《疯狂Android讲义》
android context理解
android深入理解Android_卷 二,有了这本书,可以把其它所有的android书扔掉了
经典畅销书系“深入理解Android”系列Framework卷完结篇,数十万Android开发工程师翘首以盼 从源代码层面全面、详细剖析了Android 框架UI系统的实现原理和工作机制,以及优秀代码的设计思想,填补市场空白 要想...
资源名称:深入理解ANDROID 卷3内容简介:深入理解Android(卷3)》是Android经典畅销书系(对Android系统源代码的分析最为系统和细致)“深入理解Android”系列Framework卷的第III卷,从源代码的角度,对Android...
《深入理解Android:卷2》是“深入理解Android”系列的第2本,第1本书上市后获得广大读者高度评价,在Android开发者社群内口口相传。本书不仅继承了第1本书的优点并改正了其在细微处存在的一些不足,而且还在写作的...
深入理解Android内核设计思想.pdf
android:对andriod ndk的理解
深入理解Android卷1:一本以情景方式对Android的源代码进行深入分析的书。内容广泛,以对Framework层的分析为主,兼顾Native层和Application层;分析深入,每一部分源代码的分析都力求透彻;针对性强,注重实际应用...
android简易打地鼠.zip android简易打地鼠.zip android简易打地鼠.zip android简易打地鼠.zip android简易打地鼠.zip android简易打地鼠.zip android简易打地鼠.zip android简易打地鼠.zip android简易打地鼠.zip ...
本程序包含3个模块,即Android手机客户端、PC服务器端、PC客户端; 能很好的实现3个窗口的通信。。
深入理解android卷1,深入理解android卷1,深入理解android卷1
《深入理解Android:卷I》是一本以情景方式对Android的源代码进行深入分析的书。内容广泛,以对Framework层的分析为主,兼顾Native层和Application层;分析深入,每一部分源代码的分析都力求透彻;针对性强,注重...
《深入理解Android:卷1》是一本以情景方式对Android的源代码进行深入分析的书。内容广泛,以对Framework层的分析为主,兼顾Native层和Application层;分析深入,每一部分源代码的分析都力求透彻;针对性强,注重...
《深入理解Android 卷III》PDF版本下载
android实现的超简单的绘图板,没有使用双缓冲技术
深入理解Android 卷二深入理解Android 卷二深入理解Android 卷二
android 简易camera相机,可以实现简单的拍照 & preview功能
深入理解android卷一、卷二、卷三系统的讲解了Android的启动、Binder、AMS、PWS、AudioFlinger、SurfaceFlinger、WIFI、BT和NFC知识点,适合android进阶的好书。
经典畅销书系“深入理解Android”系列Framework卷完结篇,数十万Android开发工程师翘首以盼 从源代码层面全面、详细剖析了Android 框架UI系统的实现原理和工作机制,以及优秀代码的设计思想,填补市场空白 要想...