1. 程式人生 > >Android基礎知識之四大元件Activity(五)Activity生命週期場景的應用

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狀態的方法在什麼時候被呼叫,從而去設計應用。

相關推薦

Android基礎知識四大元件ActivityActivity生命週期場景應用

今天,來寫一個關於Android四大元件Activity生命週期的一個簡單應用,做一個關於極簡單的音樂播放器(只是為了鞏固一下Activity的生命週期,並不能當作專案來用)。 先來截個介面的圖: 很簡單吧,只有三個按鈕,播放一首歌,但來研究Activity的生命週期,這

android-基礎知識整理--四大元件未完

四大元件: activity : 什麼是activity? Android程式與使用者互動的視窗 - 使用方式 生命週期 onCreat() onStart() on setContentView() ,//

Linux 基礎知識 CIFS檔案系統 samba

一、簡介 1.CIFS: CIFS 是一個新提出的協議,它使程式可以訪問遠端Internet計算機上的檔案並要求此計算機提供服務。CIFS 使用客戶/伺服器模式。客戶程式請求遠在伺服器上的伺服器程式為它提供服務。伺服器獲得請求並返回響應。CIFS是公共的或開放的SMB協議版本,並由Micro

android6.0 Activity Activity的測量Measure、佈局Layout和繪製Draw

 Android應用程式視窗的繪圖表面在建立完成之後,我們就可以從上到下地繪製它裡面的各個檢視了,即各個UI元素了。不過在繪製這些UI元素之前,我們還需要從上到下地測量它們實際所需要的大小,以及對它們的位置進行合適的安排,即對它們進行合適的佈局。在本文中,我們就將詳細

自學AndroidUI元件Fragment的基本使用

本篇為UI元件的第二篇,主要探討關於Fragment的基本使用,包括簡單的原理以及建立、修改、刪除等操作。 在本篇文章中,你將瞭解到: 1.什麼是Fragment。 2.Fragmen

Linux 基礎知識 ISCSI 檔案系統 磁碟共享

一、iSCSI簡介 iscsi是一種塊級別的協議,用於通過TCP/IP網路共享原始儲存裝置,即硬碟的共享。可以用已經存在的IP和乙太網如網絡卡、交換機、路由器等通過iSCSI協議共享和訪問儲存。 iSCSI target是一種由遠端iSCSI伺服器(target)提供的遠端硬碟。 二、磁

css基礎知識的復習總結

文本 pin zoom clear head 導航 設置 mage 之間 文檔流、浮動、清除浮動、overflow、定位 1.文檔流 css文檔流,標準流是什麽? 元素自上而下,自左而右,塊元素獨占一行,行內元素在一行上顯示,碰到父集元素的邊框換行。

css基礎知識的復習總結

網頁 元素 ati 塊元素 isp 方式 一半 浮動 .cn 1.定位的盒子居中顯示 案例一:(定位的盒子居中顯示) 預期效果 實現步驟: 設置父盒子為相對定位 設置子盒子left值為父盒子寬度一半設置子盒子左邊距為自己寬度一半 總結:margin:0 auto 只能讓在

談談-Android-PickerView系列源碼解析

需求 動態 () comm tag 多個 來源 ntc 寬高 前言   WheelView想必大家或多或少都有一定了解, 它是一款3D滾輪控件,效果類似IOS 上面的UIpickerview 。按照國際慣例,先放一張效果圖:   以上是Android-PickerView

Android基礎——項目的文件結構

好的 oid ext main 成對 之間 app cnblogs 高級 Android基礎——項目的文件結構(三) 代碼源文件夾與資源文件夾 【註】此項目文件結構僅限於Android Studio下的Android項目!!!   在一個Android項目中,代碼源文件夾有

基本知識標頭檔案 stdlib.h && conio.h

https://wenda.so.com/q/1367031948061742  來自360問答 stdlib.h   stdlib 標頭檔案裡包含了C語言的一些函式   該檔案包含了的C語言標準庫函式的定義   stdlib.h裡面定義了五種型別、一些巨集和通用工具函式。型別例如si

PHP基礎回顧cookie和session

Cookie 是什麼? cookie 常用於***識別使用者***。cookie 是一種伺服器***留在使用者計算機上的小檔案***。每當同一臺計算機通過瀏覽器請求頁面時,這臺計算機將會發送 cookie。通過 PHP,您能夠建立並取回 cookie 的值。

JavaFX UI控制元件教程Radio Button

本章討論單選按鈕控制元件和RadioButton類,該類的一個專門實現ToggleButton。 可以選擇或取消選擇單選按鈕控制元件。通常,單選按鈕組合成一個組,其中一次只能選擇一個按鈕。此行為將它們與切換按鈕區分開來,因為組中的所有切換按鈕都可以處於取消選擇狀態。

Android 開發藝術探索》讀書筆記——Activity生命週期和啟動模式

Activity 作為 Android 四大元件之首,它作為和使用者互動的介面,在開發中使用得可謂極其頻繁,所以弄清楚 Activity 的生命週期和啟動方式是非常重要的,要牢記。 1 Activity 的生命週期全面分析 1.1 典型情況下的生命週期分析 onCrea

#C語言基礎知識歸納和例題分析1

## C語言基礎知識歸納和例題分析(1) 計算機程式和計算機語言 1.程式 就是一組計算機能識別和執行的指令 2.計算機語言經歷的幾個階段 機器語言(直接執行)→符號語言(又稱組合語言)→高階語言 3.高階語

java基礎學習——子類重寫覆蓋父類的方法必須滿足的條件

子類重寫(覆蓋)父類的方法必須滿足的條件:父類中的方法在子類中必須可見,即子類繼承了父類中的該方法(可以顯式的使用super關鍵字來訪問父類中的被重寫的方法),如果父類中的方法為private型別的,那麼子類則無法繼承,也無法覆蓋。子類和父類的方法必須是例項方法,如果父類是

關於學習NDK基礎知識這些就夠了

一、指標的運算 指標的型別: 指標有型別,地址沒有型別 地址只是開始的位置,型別讀取到什麼位置結束 1、常量指標: 首先它是一個指標,常量只是用來修飾指標的定語。其定義如下: char const * cp; cha

大資料基礎知識學習-----Hive學習筆記Hive安裝環境準備

Hive安裝環境準備 Hive安裝地址 Hive安裝部署 Hive安裝及配置 把apache-hive-1.2.1-bin.tar.gz上傳到linux的/opt/software目錄下 解壓apache-hive-1.2.

Android進階自定義View1實現可換行的TextView

         今天來一起學習一下最簡單的自定義view,自己動手寫一個MyTextView,當然不會像系統的TextView那麼複雜,只是實現一下TextView的簡單功能,包括分行顯示及自定義屬性的處理,主要目的是介紹自定義view的實現的基本思路和需要掌握的一些基礎知

Android JNI開發NDK環境配置eclipse

最近開發一個小專案,需要用到native方法,於是需要配置NDK環境。首先肯定是網上找,網上比較多,但是都不全,有的已經過時了。所以,我綜合大家之長,寫了如下配置流程,供大家使用,有什麼不對的請大家指正。 總共分為5步: 1、下載NDK。這個我不說了。