Android開啟新線程播放背景音樂
在本實(shí)例用,開啟一個(gè)新的線程播放背景音樂,在音樂文件播放完畢后,暫停5秒后重新開始播放。
具體實(shí)現(xiàn):
界面(只有一個(gè)"開始"按鈕)
res/layout/main.xml:
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:id="@+id/linearLayout1" android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="vertical" > <Button android:id="@+id/button1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="開始" /> </LinearLayout>
在res/文件夾下創(chuàng)建raw目錄,在raw/下放置需要播放的背景音樂文件(這里放置的是flower.mp3文件)
MainActivity:
package com.example.test; import android.app.Activity; import android.media.MediaPlayer; import android.media.MediaPlayer.OnCompletionListener; import android.os.Bundle; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; public class MainActivity extends Activity{ private Thread thread;//聲明一個(gè)線程對(duì)象 private static MediaPlayer mp=null;//聲明一個(gè)MediaPlayer對(duì)象 @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); Button startButton=(Button)findViewById(R.id.button1);//獲取開始按鈕 startButton.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { ((Button)v).setEnabled(false);//設(shè)置按鈕不可用 //創(chuàng)建一個(gè)用于播放背景音樂的線程 thread=new Thread(new Runnable(){ @Override public void run() { playBGSound();//播放背景音樂 } }); thread.start();//開啟線程 } }); } private void playBGSound() { if(mp!=null){ mp.release();//釋放資源 } mp=MediaPlayer.create(MainActivity.this, R.raw.flower); mp.start(); //為MediaPlayer添加播放完成事件監(jiān)聽 mp.setOnCompletionListener(new OnCompletionListener() { @Override public void onCompletion(MediaPlayer mp) { try { Thread.sleep(5000);//讓線程休眠5秒 <span style="white-space:pre"> </span>playBGSound();//重新播放音樂 } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }); } @Override protected void onDestroy() { if(mp!=null){ mp.stop(); mp.release(); mp=null; } if(thread!=null){ thread=null; } super.onDestroy(); } }
運(yùn)行結(jié)果:點(diǎn)擊開始按鈕,按鈕將變成不可用狀態(tài),并且開始播放背景音樂,界面如圖
以上就是本文的全部內(nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- Android開發(fā)經(jīng)驗(yàn)談:并發(fā)編程(線程與線程池)(推薦)
- Android之線程池ThreadPoolExecutor的簡介
- Android子線程與更新UI問題的深入講解
- Android線程中Handle的使用講解
- Android線程池控制并發(fā)數(shù)多線程下載
- Android 使用AsyncTask實(shí)現(xiàn)多線程斷點(diǎn)續(xù)傳
- Android 使用AsyncTask實(shí)現(xiàn)多任務(wù)多線程斷點(diǎn)續(xù)傳下載
- 完全解析Android多線程中線程池ThreadPool的原理和使用
- 淺談Android中多線程切換的幾種方法
- Android如何調(diào)整線程調(diào)用棧大小
相關(guān)文章
Android中Intent機(jī)制詳解及示例總結(jié)(總結(jié)篇)
本文是小編日常收集整理些有關(guān)Android中Intent機(jī)制詳解及示例總結(jié),對(duì)android中intent相關(guān)知識(shí)感興趣的朋友一起學(xué)習(xí)吧2016-04-04Android sqlite cursor的遍歷實(shí)例詳解
在本篇內(nèi)容里小編給大家整理的是一篇關(guān)于Android sqlite cursor的遍歷的相關(guān)實(shí)例及知識(shí)點(diǎn),需要的朋友們可以學(xué)習(xí)下。2021-06-06Android?Activity?View加載與繪制流程深入刨析源碼
這篇文章主要介紹了Android?Activity?View的加載與繪制流程源碼分析,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2022-08-08Android中的動(dòng)態(tài)加載機(jī)制的學(xué)習(xí)研究
本篇文章主要介紹了Android中的動(dòng)態(tài)加載機(jī)制,對(duì)android項(xiàng)目開發(fā)有著一定的幫助,有興趣的同學(xué)可以了解一下。2016-11-11Android自定義view實(shí)現(xiàn)滑動(dòng)解鎖九宮格控件
這篇文章主要介紹了Android自定義view實(shí)現(xiàn)滑動(dòng)解鎖九宮格控件,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)吧2023-02-02android 獲取文件的擴(kuò)展名和去掉文件擴(kuò)展名的小例子
android 獲取文件的擴(kuò)展名和去掉文件擴(kuò)展名的小例子,需要的朋友可以參考一下2013-06-06不允許錯(cuò)過的Anndroid技術(shù)經(jīng)驗(yàn)60條
不允許錯(cuò)過的Anndroid技術(shù)經(jīng)驗(yàn)60條,與大家分享,希望可以提高大家Android開發(fā)水平,感興趣的朋友可以參考一下2016-02-02android實(shí)現(xiàn)靜默安裝與卸載的方法
這篇文章主要介紹了android實(shí)現(xiàn)靜默安裝與卸載的方法,涉及Android權(quán)限與命令行操作的相關(guān)技巧,需要的朋友可以參考下2015-05-05