service 簡介
何謂“service”?“service” 意思即“服務”的意思, 像 windows 上面的服務一樣,有些服務是在背景上運作,幹着靜悄悄的勾當不讓人知道 。與 activity 不同,service 是并不直接與使用者互動的運作于背景的一類元件。
google對service的解釋
一個服務不是一個單獨的程序。服務對象本身并不意味着它是在自己的程序中運作,除非另有規定,否則它與運作程式是同在一個程序中。
一個服務不是一個單獨的線程。它是一種手段,本身做着主線的工作 (以避免應用程式沒有響應的錯誤)。
service 與 activity 的相同點與不同點
不同點:activity是與使用者互動的元件,即我們用眼睛可以看到的界面,而service是在背景運作,執行隐藏的動作。
相同點:使用activity 時我們需要在配置檔案中聲明<activity>标簽,同樣的使用service 也需要在配置檔案中聲明<service>标簽
使用service
建立service需要繼承自 android.app.service 的類,然後重新實作在service各個狀态要回調的方法,service的回調方法有三個,分别是:
oncreate()
建立
onstart()
開始
ondestry()
釋放
注意:service是不能自己啟動的,隻有通過 context 對象 調用startservice和bindservice方法來啟動。但兩種方法的service生命周期是不同的,下面我們通過一個小例子來差別各自的生命周期。
例子效果圖如下:
代碼如下:
package com.terry;
import android.app.service;
import android.content.intent;
import android.os.ibinder;
import android.util.log;
public class servicesample extends service {
final string tag="service";
@override
public ibinder onbind(intent intent) {
// todo auto-generated method stub
log.i(tag,"onbind");
return null;
}
public boolean onunbind(intent intent) {
log.i(tag, "onunbind");
return super.onunbind(intent);
public void onrebind(intent intent) {
// todo auto-generated method stub
super.onrebind(intent);
log.i(tag, "onrebind");
public void oncreate() {
super.oncreate();
log.i(tag, "oncreate");
public void ondestroy() {
super.ondestroy();
log.i(tag, "ondestroy");
public void onstart(intent intent, int startid) {
super.onstart(intent, startid);
log.i(tag, "onstart");
}
當調用startservice方法時:
1、若servcie沒有啟動,則首先會調用該service的oncreate方法,然後再調用onstart方法。
2、若service己經啟動則首先會直接調用onstart方法,
3、關閉時使用stopservice來關閉。
當調用bindservice方法時:
1、若service沒有啟動,則首先調用oncreate方法,來初始化啟動service,然後調用service的onbind。
2、通過onunbind和ondestry方法停止service運作。
下面通過一組圖來更詳細的說明service的生命周期
開始服務
停止服務
綁定服務
銷毀服務
音樂服務demo
通過上面的小例子可能有些園友還是很模糊,下面通過一個播放音樂的小例子加深大家對service 的了解,該例子通過播放一首mp3 ,當使用者點選開始“按鈕”,音樂開始播放,即時你退出程式音樂也會播放,點選“停止”按鈕,停止播放音樂 。
該例子繼承service 然後重寫onstart播放音樂 重寫ondestry停止音樂 ,代碼如下:
import android.media.mediaplayer;
public class musicserver extends service {
private mediaplayer player;
if(player==null)
{
player=mediaplayer.create(this, r.raw.start);
player.start();
player.stop();
完成了service類,我們隻要在對應的activity的事件中調用服務即可實作,代碼如下:
import android.app.activity;
import android.os.bundle;
import android.view.view;
import android.view.view.onclicklistener;
import android.widget.button;
public class musicactivity extends activity{
private intent intent=new intent("com.terry.android.music");
protected void oncreate(bundle savedinstancestate) {
super.oncreate(savedinstancestate);
setcontentview(r.layout.music);
findview();
viewholder.mybutton.setonclicklistener(new onclicklistener() {
@override
public void onclick(view v) {
// todo auto-generated method stub
startservice(intent);
}
});
viewholder.mybutton2.setonclicklistener(new onclicklistener() {
stopservice(intent);
void findview(){
viewholder.mybutton=(button)findviewbyid(r.id.play);
viewholder.mybutton2=(button)findviewbyid(r.id.stop);
運作效果圖:
差不多就到這裡吧,有點晚了,把源碼提供給大家:
本文 作者 “terry_龍”