今天,来写一个关于Android四大组件Activity生命周期的一个简单应用,做一个关于极简单的音乐播放器(只是为了巩固一下Activity的生命周期,并不能当作项目来用)。
先来截个界面的图:
很简单吧,只有三个按钮,播放一首歌,但来研究Activity的生命周期,这就足够了。
好了,我们先来new 一个Project,将三个图片资源拷贝到drawable文件夹里,在创建一个文件夹命名为“raw”,将音乐文件拷贝进去。
在布局文件中这样写:
<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"
tools:context=".MainActivity"
android:orientation="horizontal">
<ImageButton
android:src="@drawable/start"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/ibtnStart" />
<ImageButton
android:src="@drawable/pause"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/ibtnPause" />
<ImageButton
android:src="@drawable/stop"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/ibtnStop" />
</LinearLayout>
MainActivity方法中的Java代码:
package com.daxiangzai.androiddemo.applicationofactivitylifecycle;
import android.media.MediaPlayer;
import android.support.v7.app.ActionBarActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.ImageButton;
public class MainActivity extends ActionBarActivity implements View.OnClickListener {
private MediaPlayer mp;
private ImageButton start, pause, stop;
private int position; //用来存放播放位置
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//调用方法获得按钮并设置监听
init();
//调用方法设置按钮状态为未播放状态
initStop();
//此方法用来判断之前Activity意外被销毁,若被销毁(即Bundle值不为空),获得播放位置
if (savedInstanceState != null) {
//取出上次播放的位置
position = savedInstanceState.getInt("position");
//调用方法获得播放文件
createMediaPlayer();
/*
Time:2015-8-3
Reason: Here is repeated use, MediaPlayer.start in onResume method.
Authod: daxiangzai
*/
/*
//调至上次播放位置
mp.seekTo(position);
//开始播放
mp.start();*/
//设置按钮状态为播放状态
initplay();
}
}
//获得播放文件
private void createMediaPlayer() {
mp = MediaPlayer.create(MainActivity.this, R.raw.mysoul);
}
//设置按钮状态为播放状态
private void initplay() {
start.setEnabled(false);
pause.setEnabled(true);
stop.setEnabled(true);
}
//设置按钮状态为未播放状态
private void initStop() {
start.setEnabled(true);
pause.setEnabled(false);
stop.setEnabled(false);
}
//调用方法获得按钮并设置监听
private void init() {
//查找到按钮
start = (ImageButton) findViewById(R.id.ibtnStart);
pause = (ImageButton) findViewById(R.id.ibtnPause);
stop = (ImageButton) findViewById(R.id.ibtnStop);
//设置监听
start.setOnClickListener(this);
pause.setOnClickListener(this);
stop.setOnClickListener(this);
}
//各个按钮的监听事件
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.ibtnStart:
//调用方法获得播放文件
createMediaPlayer();
//音乐播放
mp.start();
//设置按钮状态为播放状态
initplay();
break;
case R.id.ibtnPause:
//判断是否正在播放,如果是,暂停播放,否则开始播放
if (mp.isPlaying()) {
mp.pause();
} else {
mp.start();
}
break;
case R.id.ibtnStop:
//停止播放
mp.stop();
//设置按钮状态为未播放状态
initStop();
break;
}
}
//此方法在当前Activity非活动Activity的时候会调用
@Override
protected void onPause() {
super.onPause();
//暂停播放
mp.pause();
//获取播放位置
position = mp.getCurrentPosition();
}
//此方法再重新启动Activity时调用
@Override
protected void onResume() {
super.onResume();
//若播放位置不是0,则继续播放
if (position != 0) {
mp.seekTo(position);
mp.start();
}
}
//调用onDestroy方法销毁Activity,并释放音乐播放内存
@Override
protected void onDestroy() {
super.onDestroy();
//若播放过释放音乐播放内存
if (mp != null) {
mp.reset();
mp = null;
}
}
//此方法在意外杀死Activity时调用,用来保存播放位置
@Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
//暂停播放
mp.pause();
//获取当前播放位置
position = mp.getCurrentPosition();
//储存到Bundle对象里
outState.putInt("position", position);
}
}
方法的用途,在上面注释中写的很清楚了。
在切换到别的Activity时(例如:来电话了),此程序的Activity会执行onPause()方法暂停掉音乐。从而使得此应用与其他的Activity之间互不影响,当恢复此Activity时,音乐会继续上次的播放。
当Activity被意外销毁的时候(利用横竖屏切换模仿),当再次回复Activity时会接着上次的播放位置自动播放。
在这个应用中,我们应该熟悉Activity的生命周期方法与保存Activity状态的方法在什么时候被调用,从而去设计应用。