Android Service

Similar documents
多媒體應用 13 新增專案並完成版面配置 <ExMusic01> <activity_main.xml> ImageView ID imgplay ImageView ID imgstop ImageView ID imgfront TextView ID txtsong TextView ID t

res/layout 目录下的 main.xml 源码 : <?xml version="1.0" encoding="utf 8"?> <TabHost android:layout_height="fill_parent" xml

主程式 : public class Main3Activity extends AppCompatActivity { ListView listview; // 先整理資料來源,listitem.xml 需要傳入三種資料 : 圖片 狗狗名字 狗狗生日 // 狗狗圖片 int[] pic =new

Android Fragment

Dynamic Layout in Android

Android + NFC

用手機直接傳值不透過網頁連接, 來當作搖控器控制家電 ( 電視遙控器 ) 按下按鍵發送同時會回傳值來確定是否有送出 問題 :1. 應該是使用了太多 thread 導致在傳值上有問題 2. 一次按很多次按鈕沒辦法即時反應

教育部補助資訊軟體人才培育先導計畫 100 年度課程發展專案計畫 實驗課程名稱 : IPC(Inter-Process Communication) 開發教師 : 張晉源老師 開發學生 : 林政揚 學校系所 : 樹德科技大學資訊工程學系

中 文 摘 要 智 慧 型 手 機 由 於 有 強 大 的 功 能, 以 及 優 渥 的 便 利 性, 還 能 與 網 路 保 持 隨 時 的 鏈 結 與 同 步 更 新, 因 此 深 受 廣 大 消 費 者 喜 愛, 當 然, 手 機 遊 戲 也 成 為 現 代 人 不 可 或 缺 的 娛 樂 之

任務二 : 產生 20 個有炸彈的磚塊, 放在隨機的位置編輯 Block 類別的程式碼 import greenfoot.; // (World, Actor, GreenfootImage, Greenfoot and MouseInfo) Write a description of class

單步除錯 (1/10) 打開 Android Studio, 點選 Start a new Android Studio project 建立專案 Application name 輸入 BMI 點下 Next 2 P a g e

詞 彙 表 編 號 詞 彙 描 述 1 預 約 人 資 料 中 文 姓 名 英 文 姓 名 身 份 證 字 號 預 約 人 電 話 性 別 2 付 款 資 料 信 用 卡 別 信 用 卡 號 信 用 卡 有 效 日 期 3 住 房 條 件 入 住 日 期 退 房 日 期 人 數 房 間 數 量 入

建模与图形思考

RecyclerView and CardVew

Microsoft Word - 01.DOC

预览图 : (2) 在 SelectCity.java 中增加控件, 用于绑定 select_city 文件的 ListView, TextView,EditTest 等控件 代码和注释如下 :

chp6.ppt

實作SQLiteOpenHelper類別

建立Android新專案

Android 编程基础 Android 开发教程 & 笔记 1

1: public class MyOutputStream implements AutoCloseable { 3: public void close() throws IOException { 4: throw new IOException(); 5: } 6:

幻灯片 1

Chapter 9: Objects and Classes

建立Android新專案

Android 开发教程

投影片 1

目录 一 功能介绍 功能列表 使用限制...3 二 Android studio 如何导入 SDK SDK 文件结构 导入必要文件 工程配置...6 三 调用 SDK 初始化 如何开始预览...1

Lecture01_Android介绍

Chapter 10

建模与图形思考

0511-Android程式之GPS應用_專題週記4

EJB-Programming-4-cn.doc

《大话设计模式》第一章

untitled

威 福 髮 藝 店 桃 園 市 蘆 竹 區 中 山 里 福 祿 一 街 48 號 地 下 一 樓 50,000 獨 資 李 依 純 105/04/06 府 經 登 字 第 號 宏 品 餐 飲 桃 園 市 桃 園 區 信 光 里 民

第一章 Android 简介与开发环境搭建

Lecture01_Android介绍

Java

D2 17/10 食 完 早 餐 去 中 山 陵 和 明 孝 陵, 灵 谷 寺 到 景 区 的 巴 士 : 游 1 游 2 游 路 ( 票 价 在 1-2 元 间 ) 三 个 地 点 中 间 凭 门 票 免 费 乘 坐 景 区 小 火 车 往 来 晚 上 有 力 气 的 话 去 夫 子

1.JasperReport ireport JasperReport ireport JDK JDK JDK JDK ant ant...6

Database_001

Java java.lang.math Java Java.util.Random : ArithmeticException int zero = 0; try { int i= 72 / zero ; }catch (ArithmeticException e ) { // } 0,

03 开发入门.key

【主持人】:给大家介绍一下,这次的培训是我们画刊部的第三次培训,当然今天特别有幸请来著吊的摄影家李少白老师给我们讲课


Android + WebService

Microsoft Word - 02.目錄.doc

「西醫基層總額支付委員會《第28次委員會議紀錄

1.5招募说明书(草案)

(TestFailure) JUnit Framework AssertionFailedError JUnit Composite TestSuite Test TestSuite run() run() JUnit

手说TTS开发指南

第一章 章标题-F2 上空24,下空24

图 6-1 主界面 MainActivity 界面对应的布局文件 (activity_main.xml) 如下所示 : <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="

新版 明解C++入門編

FY.DOC

PowerPoint 簡報

使 用 Java 语 言 模 拟 保 险 箱 容 量 门 板 厚 度 箱 体 厚 度 属 性 锁 具 类 型 开 保 险 箱 关 保 险 箱 动 作 存 取 款

掌盟 SoEasy SDK 开发者帮助文档 1. 接入前项目检查 根据游戏接入后出现的问题, 对游戏项目做以下几点要求 : a) AndroidManifest.xml 中 android:targetsdkversion="19" b) 如果 AndroidManifest.xml 有 insta

JavaIO.PDF

<4D F736F F F696E74202D20332D322E432B2BC3E6CFF2B6D4CFF3B3CCD0F2C9E8BCC6A1AAD6D8D4D8A1A2BCCCB3D0A1A2B6E0CCACBACDBEDBBACF2E707074>

概述

_banneradview.settest(true); _banneradview.setuserkeywords("swimming"); _banneradview.setusercategories("1,3,4"); _banneradview.setusergender(jdbanner

書面

使用MapReduce读取XML文件

Android Android Android SDK iv

untitled

國立中山大學學位論文典藏.PDF

雲端 Cloud Computing 技術指南 運算 應用 平台與架構 10/04/15 11:55:46 INFO 10/04/15 11:55:53 INFO 10/04/15 11:55:56 INFO 10/04/15 11:56:05 INFO 10/04/15 11:56:07 INFO

2 WF 1 T I P WF WF WF WF WF WF WF WF 2.1 WF WF WF WF WF WF

Microsoft Word cppFinalSolution.doc

untitled

Fun Time (1) What happens in memory? 1 i n t i ; 2 s h o r t j ; 3 double k ; 4 char c = a ; 5 i = 3; j = 2; 6 k = i j ; H.-T. Lin (NTU CSIE) Referenc

OOP with Java 通知 Project 4: 4 月 18 日晚 9 点 关于抄袭 没有分数

Java講義

基于ECO的UML模型驱动的数据库应用开发1.doc

投影片 1

移动平台期末展示

untitled

Microsoft Word - ch04三校.doc

安卓游戏大全美女车震小说情节 韩国美女车震视频秘密爱 韩国美女车震

Microsoft Word - 第3章.doc

mvc

Microsoft Word - 第1章 Android基本概念.docx

Android 开发教程

RxJava

INTRODUCTION TO COM.DOC

JBuilder Weblogic

Microsoft PowerPoint - 12 特色开发.ppt [兼容模式]

Microsoft Word - PHP7Ch01.docx

ShareText

Microsoft Word - ASM SDK 說明文件

<4D F736F F D20B5DA33D5C220D3CECFB7D6D0B5C4B6E0CFDFB3CC2E646F6378>

_banneradview.setuserkeywords("swimming"); _banneradview.setusercategories("1,3,4"); _banneradview.setusergender(jdbanneradview.gender_male); _bannera

Microsoft Word - Chap04.doc

KillTest 质量更高 服务更好 学习资料 半年免费更新服务

untitled

Microsoft Word - 第3章 Activity.doc

政府再造的基本精神:小而美或小而能?

北 风 网 讲 师 原 创 作 品 ---- 仅 供 学 员 内 部 交 流 使 用 前 言 吾 尝 终 日 而 思 矣, 不 如 须 臾 之 所 学 也 ; 吾 尝 跂 而 望 矣, 不 如 登 高 之 博 见 也 登 高 而 招, 臂 非 加 长 也, 而 见

Transcription:

Android Service- 播放音樂 建國科技大學資管系 饒瑞佶 2013/7 V1

Android Service Service 是跟 Activity 並行 一個音樂播放程式若沒使用 Service, 即使按 home 鍵畫面離開之後, 音樂還是照播 如果再執行一次程式, 新撥放的音樂會跟先前撥放的一起撥, 最後程式就會出錯 執行中的程式完全看不到! 但是, 寫成 Service 就不同了 Activity 只負責顯示, 撥放的任務則是交給 service, Service 是沒有 UI 的, 在 trace 的時候可以用 System.out.println 來測試是否有成功呼叫 Service 就像是一個代理人, 將可以背景執行的程序 ( 像是 MediaPlayer()) 交給他就對了

先試試不用 Service 撥放音樂 <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/ res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent" > <Button android:id="@+id/play" android:layout_width="fill_parent" android:layout_height="wrap_content" android:text=" 開始播放 "/> <Button android:id="@+id/stop" android:layout_width="fill_parent" android:layout_height="wrap_content" android:text=" 停止播放 "/> <TextView android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="@string/hello" /> </LinearLayout>

先試試不用 Service 撥放音樂 res 中加入 raw/test.mp3

先試試不用 Service 撥放音樂

@Override public void oncreate(bundle savedinstancestate) { super.oncreate(savedinstancestate); setcontentview(r.layout.main); // 對應 layout 物件 buttonstart = (Button) findviewbyid(r.id.play); buttoncontinueplay = (Button) findviewbyid(r.id.continueplay); buttonpause = (Button) findviewbyid(r.id.pause); buttonstop = (Button) findviewbyid(r.id.stop); textstate = (TextView)findViewById(R.id.tv1); // 設定 onclick 事件 buttonstart.setonclicklistener(this); buttonstop.setonclicklistener(this); buttonpause.setonclicklistener(this); buttoncontinueplay.setonclicklistener(this); // 設定物件是否可用 buttonstart.setenabled(true); buttoncontinueplay.setenabled(false); buttonpause.setenabled(false); buttonstop.setenabled(false); // 建立 mediplayer 物件 mediaplayer = new MediaPlayer();

Play

Play public void onclick(view src) { switch (src.getid()) { case R.id.Play: mediaplayer = MediaPlayer.create(MediaController2.this, R.raw.test); try { mediaplayer.start(); textstate.settext("- Playing -"); buttonstart.setenabled(false); buttoncontinueplay.setenabled(false); buttonpause.setenabled(true); buttonstop.setenabled(true); catch (IllegalStateException e) { // TODO Auto-generated catch block e.printstacktrace();

Play // 播放完成 mediaplayer.setoncompletionlistener(new MediaPlayer.OnCompletionListener() { public void oncompletion(mediaplayer arg0) { try { // 釋放 mediaplayer mediaplayer.release(); textstate.settext("play end!"); // 設定物件是否可用 buttonstart.setenabled(true); buttoncontinueplay.setenabled(false); buttonpause.setenabled(false); buttonstop.setenabled(false); catch (Exception e) { textstate.settext(e.tostring()); e.printstacktrace(); );

Play // 播放錯誤 mediaplayer.setonerrorlistener(new MediaPlayer.OnErrorListener() { public boolean onerror(mediaplayer arg0, int arg1, int arg2) { try { // 釋放 mediaplayer mediaplayer.release(); textstate.settext("play ERROR!"); catch (Exception e) { textstate.settext(e.tostring()); e.printstacktrace(); return false; ); break;

ContinuePlay case R.id.ContinuePlay: try { mediaplayer.start(); textstate.settext("- Playing -"); buttonstart.setenabled(false); buttoncontinueplay.setenabled(false); buttonpause.setenabled(true); buttonstop.setenabled(true); catch (IllegalStateException e) { // TODO Auto-generated catch block e.printstacktrace(); break;

Pause case R.id.Pause: try { mediaplayer.pause(); textstate.settext("- Pause -"); buttonstart.setenabled(true); buttoncontinueplay.setenabled(true); buttonpause.setenabled(false); buttonstop.setenabled(true); catch (IllegalStateException e) { // TODO Auto-generated catch block e.printstacktrace(); break;

Stop case R.id.Stop: try { mediaplayer.stop(); textstate.settext("- Stop -"); buttonstart.setenabled(true); buttoncontinueplay.setenabled(false); buttonpause.setenabled(false); buttonstop.setenabled(false); catch (IllegalStateException e) { // TODO Auto-generated catch block e.printstacktrace(); break; Switch 的結束 onclick 的結束

問題 產生重複撥放 無法從執行中程序停止

Service 流程

改用 Service 撥放音樂

改用 Service 撥放音樂

改用 Service 撥放音樂

改用 Service 撥放音樂

改用 Service 撥放音樂 public class MusicService extends Service { MediaPlayer player; @Override public IBinder onbind(intent arg0) { // TODO Auto-generated method stub return null; @Override public void oncreate() { //Service 首先啟動 super.oncreate(); player = new MediaPlayer();

改用 Service 撥放音樂 @Override public void onstart(intent intent, int startid) { // 完成 oncreate() 後啟動 if (intent!= null) { Bundle bundle = intent.getextras(); if (bundle!= null) { int op = bundle.getint("op"); switch (op) { case 1: //play player=mediaplayer.create(this, R.raw.test) ; player.start(); break; case 2: //replay player.start(); break; case 3: //pause player.pause(); break; case 4: //stop if (player!= null) { player.stop(); break;

改用 Service 撥放音樂 @Override public void ondestroy() { super.ondestroy(); if(player!=null){ player.stop(); player.release();

修正 AndroidManifest.xml 加入到 <application> 中 <service android:enabled="true" android:name=".musicservice"> <action android:name="ccc.android.musicservice" /> </service>

問題是否還在? 產生重複撥放? 無法從執行中程序停止?

背景音樂

MyBackVoice.java

public void oncreate(bundle savedinstancestate){ super.oncreate(savedinstancestate); setcontentview(r.layout.main); mmediaplayer = MediaPlayer.create(this,R.raw.test); mmediaplayer.start(); @Override protected void onpause() { super.onpause(); mmediaplayer.pause(); // 記得現在的位置 length = mmediaplayer.getcurrentposition();

@Override protected void onresume() { // TODO Auto-generated method stub super.onresume(); mmediaplayer.seekto(length); mmediaplayer.start(); @Override protected void ondestroy() { // TODO Auto-generated method stub super.ondestroy(); mmediaplayer.stop();

@Override public void onbackpressed() { return; // 讓按鍵失效, 使 resume 後可以繼續撥放 @Override protected void onresume() { // TODO Auto-generated method stub super.onresume(); mmediaplayer.seekto(length); mmediaplayer.start(); @Override protected void ondestroy() { // TODO Auto-generated method stub super.ondestroy(); mmediaplayer.stop();

小補充 public void oncreate(bundle savedinstancestate){ super.oncreate(savedinstancestate); setcontentview(r.layout.main); // 透過 sdcard mmediaplayer = new MediaPlayer(); try { mmediaplayer.setdatasource("/sdcard/test.mp3"); mmediaplayer.prepare(); catch (IllegalArgumentException e) { // TODO 自動產生的 catch 區塊 e.printstacktrace(); catch (IllegalStateException e) { // TODO 自動產生的 catch 區塊 e.printstacktrace(); catch (IOException e) { // TODO 自動產生的 catch 區塊 e.printstacktrace(); // 透過資源檔 //mmediaplayer = MediaPlayer.create(this,R.raw.tt); mmediaplayer.start();