|
Service 簡介 何謂“Service”?“Service” 意思即“服務(wù)”的意思, 像 Windows 上面的服務(wù)一樣,有些服務(wù)是在后臺(tái)上運(yùn)行,干著靜悄悄的勾當(dāng)不讓人知道 。與 Activity 不同,Service 是并不直接與用戶交互的運(yùn)行于后臺(tái)的一類組件。
Google對Service的解釋 - 一個(gè)服務(wù)不是一個(gè)單獨(dú)的進(jìn)程。服務(wù)對象本身并不意味著它是在自己的進(jìn)程中運(yùn)行,除非另有規(guī)定,否則它與運(yùn)行程序是同在一個(gè)進(jìn)程中。
- 一個(gè)服務(wù)不是一個(gè)單獨(dú)的線程。它是一種手段,本身做著主線的工作 (以避免應(yīng)用程序沒有響應(yīng)的錯(cuò)誤)。
Service 與 Activity 的相同點(diǎn)與不同點(diǎn) - 不同點(diǎn):Activity是與用戶交互的組件,即我們用眼睛可以看到的界面,而Service是在后臺(tái)運(yùn)行,執(zhí)行隱藏的動(dòng)作。
- 相同點(diǎn):使用Activity 時(shí)我們需要在配置文件中聲明<activity>標(biāo)簽,同樣的使用Service 也需要在配置文件中聲明<service>標(biāo)簽
使用Service 創(chuàng)建Service需要繼承自 android.app.Service 的類,然后重新實(shí)現(xiàn)在Service各個(gè)狀態(tài)要回調(diào)的方法,Service的回調(diào)方法有三個(gè),分別是: - onCreate()
創(chuàng)建 - onStart()
開始 - onDestry()
釋放
注意:Service是不能自己啟動(dòng)的,只有通過 Context 對象 調(diào)用startService和bindService方法來啟動(dòng)。但兩種方法的Service生命周期是不同的,下面我們通過一個(gè)小例子來區(qū)別各自的生命周期。 例子效果圖如下:
代碼如下:
- package com.terry;[/align][align=left]import android.app.Service;
- import android.content.Intent;
- import android.os.IBinder;
- import android.util.Log;[/align][align=left]public class ServiceSample extends Service {[/align][align=left] final String TAG="Service";
- @Override
- public IBinder onBind(Intent intent) {
- // TODO Auto-generated method stub
- Log.i(TAG,"onBind");
- return null;
- }
- @Override
- public boolean onUnbind(Intent intent) {
- // TODO Auto-generated method stub
- Log.i(TAG, "onUnbind");
- return super.onUnbind(intent);
- }[/align][align=left] @Override
- public void onRebind(Intent intent) {
- // TODO Auto-generated method stub
- super.onRebind(intent);
- Log.i(TAG, "onRebind");
- }
- @Override
- public void onCreate() {
- // TODO Auto-generated method stub
- super.onCreate();
- Log.i(TAG, "onCreate");
- }
- @Override
- public void onDestroy() {
- // TODO Auto-generated method stub
- super.onDestroy();
- Log.i(TAG, "onDestroy");
- }
- @Override
- public void onStart(Intent intent, int startId) {
- // TODO Auto-generated method stub
- super.onStart(intent, startId);
- Log.i(TAG, "onStart");
- }
- }
當(dāng)調(diào)用startService方法時(shí):1、若Servcie沒有啟動(dòng),則首先會(huì)調(diào)用該Service的onCreate方法,然后再調(diào)用onStart方法。 2、若Service己經(jīng)啟動(dòng)則首先會(huì)直接調(diào)用onStart方法, 3、關(guān)閉時(shí)使用stopservice來關(guān)閉。
當(dāng)調(diào)用bindService方法時(shí): 綁定服務(wù)
銷毀服務(wù)
音樂服務(wù)DEMO通過上面的小例子可能有些園友還是很模糊,下面通過一個(gè)播放音樂的小例子加深大家對Service 的理解,該例子通過播放一首mp3 ,當(dāng)用戶點(diǎn)擊開始“按鈕”,音樂開始播放,即時(shí)你退出程序音樂也會(huì)播放,點(diǎn)擊“停止”按鈕,停止播放音樂 。該例子繼承service 然后重寫onStart播放音樂 重寫onDestry停止音樂 ,代碼如下:
- package com.terry;
- import android.app.Service;
- import android.content.Intent;
- import android.media.MediaPlayer;
- import android.os.IBinder;
- public class musicServer extends Service {
- private MediaPlayer player;
- @Override
- public IBinder onBind(Intent intent) {
- // TODO Auto-generated method stub
- return null;
- }
- @Override
- public void onStart(Intent intent, int startId) {
- // TODO Auto-generated method stub
- super.onStart(intent, startId);
- if(player==null)
- {
- player=MediaPlayer.create(this, R.raw.start);
- player.start();
- }
- }
- @Override
- public void onDestroy() {
- // TODO Auto-generated method stub
- super.onDestroy();
- player.stop();
- }
- }
完成了service類,我們只要在對應(yīng)的Activity的事件中調(diào)用服務(wù)即可實(shí)現(xiàn),代碼如下:
- package com.terry;
- import android.app.Activity;
- import android.content.Intent;
- 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");
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- // TODO Auto-generated method stub
- 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(){
- @Override
- public void onClick(View v) {
- // TODO Auto-generated method stub
- stopService(intent);
- }
- });
- }
- void findView(){
- viewHolder.myButton=(Button)findViewById(R.id.play);
- viewHolder.myButton2=(Button)findViewById(R.id.stop);
- }
- }
|