Android基础知识之四大组件Activity(五)Activity生命周期场景的应用

今天,来写一个关于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状态的方法在什么时候被调用,从而去设计应用。


资源文件与代码:http://download.csdn.net/detail/lxawcf/8957321

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值