android Service 的簡單使用

一、要使用Service,首先就是在配置文件裏嗎添加Service,若是不填加,你的Service是不可以使用的。目前學到的方法有兩種java

   方法一:<service android:enabled="true" android:name=".PlayService" />android

   方法二:<service android:name=".PlayService" />app

  點後面是Service類的名字。ide

二、工程包括兩個類:oop

ServiceActivity.javathis

PlayService.javaspa

其中:ServiceActivity.java定義了兩個按鈕,分別控制音樂的播放與中止。對象

用startService和stopService完成Activity與Service之間的切換,啓動Service以及取消Service,繼承

若是不用按鈕,能夠在Activity的OnCreate和OnDestrpy裏面啓動和取消Service,以下:接口

 

複製代碼

代碼

 

@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);



this.startService(new Intent(this, PlayService.class));
}

@Override

protected void onDestroy() {
super.onDestroy();
this.stopService(new Intent(this,PlayService.class));
}

複製代碼

 

在activity裏面,若是須要使用Service的話,須要調用startService(),從而利用startService()去調用Service中的OnCreate()和onStart()方法來啓動一個後臺的Service。

啓動一個Service的過程以下:context.startService() ->onCreate()->onStart()->Servicerunning其中onCreate()能夠進行一些服務的初始化工做,onStart()則啓動服務。

中止一個Service的過程以下:context.stopService() |->onDestroy() ->Service stop 

 

建立Service須要繼承自 android.app.Service 的類,而後從新實如今Service各個狀態要回調的方法,Service的回調方法有三個,分別是:

  • onCreate()
    建立
  • onStart()
    開始
  • onDestry()
    釋放

注意:Service是不能本身啓動的,只有經過 Context 對象 調用startService和bindService方法來啓動。也就是說Service不能本身調用的,因此咱們看見不少Service都是用Activity調用的。

(1)Context.startService():Service會經歷onCreate -> onStart(若是Service尚未運行,則android先調用onCreate()而後調用onStart();若是Service已經運行,則只調用onStart(),因此一個Service的onStart方法可能會重複調用屢次);stopService的時候直接onDestroy,若是是調用者本身直接退出而沒有調用stopService的話,Service會一直在後臺運行。該Service的調用者再啓動起來後能夠經過stopService關閉Service。 注意,屢次調用Context.startservice()不會嵌套(即便會有相應的onStart()方法被調用),因此不管同一個服務被啓動了多少次,一旦調用Context.stopService()或者stopSelf(),他都會被中止。補充說明:傳遞給startService()的Intent對象會傳遞給onStart()方法。調用順序爲:onCreate --> onStart(可屢次調用) --> onDestroy。
(2)Context.bindService():Service會經歷onCreate() -> onBind(),onBind將返回給客戶端一個IBind接口實例,IBind容許客戶端回調服務的方法,好比獲得Service運行的狀態或其餘操做。這個時候把調用者(Context,例如Activity)會和Service綁定在一塊兒,Context退出了,Srevice就會調用onUnbind -> onDestroyed相應退出,所謂綁定在一塊兒就共存亡了
補充說明:傳遞給bindService()的Intent對象會傳遞給onBind(),傳遞給unbindService()的Intent對象會傳遞給onUnbind()方法調用順序爲:onCreate --> onBind(只一次,不可屢次綁定) --> onUnbind --> onDestory。
(3)注意事項:在Service每一次的開啓關閉過程當中,只有onStart可被屢次調用(經過屢次startService調用),其餘onCreate,onBind,onUnbind,onDestory在一個生命週期中只能被調用一次。還有一點,目前我沒有遇到過須要startService和bindService交互使用的狀況(我認爲不會有這種需求),因此沒必要去考慮交互的問題,待遇到時再考慮不遲。
(4)BroadcastReceiver只能經過startService啓動Service,由於廣播自己生命週期很短,bind的話沒有意義

 

PlayService.java是Service類,

包括OnCreate,OnStart,OnDestroy三種方法,

   其中OnCreate無關緊要,若是有,能夠在這裏建立與MediaPlayerd的連接。若是無,能夠在Onstart裏面建立這個連接。

        OnCreate在音樂播放週期裏面(未OnDestroy)以前,只建立一次,而每按一次播放,OnStart就會被調用一次。

        OnStart,裏面能夠啓動播放音樂,

        OnDestroy,裏面調用中止播放音樂。

若是按了中止按鈕,會調用(或者打印Log更直觀)「ServiconDestroy「,可是Activity不會退出。

當退出Activity的時候,會相繼調用(或者打印Log更直觀)"ActivityonStop",和"ActivityOnDestroy"此時,音樂播放是不會中止的,

能夠知道,若是想讓Service一啓動就執行的代碼,能夠寫在Service的OnCreate或OnStart,裏面,會在啓動Service的時候自動調用,與Activity自動調用OnCreate道理是同樣的。

代碼以下:

複製代碼

代碼

 

package com.service.su;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;

public class ServiceActivity extends Activity implements OnClickListener {
/** Called when the activity is first created. */
Button buttonOn, buttonOff;
String TAG
= "ServiceActivity";

@Override

public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);

buttonOn
= (Button) findViewById(R.id.button_on);
buttonOff
= (Button) findViewById(R.id.button_off);

buttonOn.setOnClickListener(
this);
buttonOff.setOnClickListener(
this);
Log.v(TAG,
"ActivityonCreate");
}

@Override

public void onClick(View v) {
// TODO Auto-generated method stub
switch (v.getId()) {
case (R.id.button_on):
Log.v(TAG,
"ActivitystartService");
this.startService(new Intent(this,PlayService.class));
// startService(new Intent(this, PlayService.class));

break;
case (R.id.button_off): {
Log.v(TAG,
"ActivitystopService");
this.stopService(new Intent(this,PlayService.class));
//stopService(new Intent(this, PlayService.class));

}
break;

default:
break;

}

}

@Override

protected void onStop() {
// TODO Auto-generated method stub
super.onStop();
Log.v(TAG,
"ActivityonStop");
}

@Override

protected void onDestroy() {
// TODO Auto-generated method stub
Log.v(TAG, "ActivityonDestroy");
super.onDestroy();

}

}

複製代碼

複製代碼

代碼

 

package com.service.su;

import java.io.IOException;

import android.app.Service;
import android.content.Intent;
import android.media.MediaPlayer;
import android.os.IBinder;
import android.util.Log;
import android.widget.Toast;

public class PlayService extends Service {
String TAG
= "ServiceActivity";
MediaPlayer mediaPlayer;

@Override

public IBinder onBind(Intent intent) {
// TODO Auto-generated method stub
return null;
}

@Override

public void onCreate() {
// TODO Auto-generated method stub
super.onCreate();
Toast.makeText(
this, "Play Service Created", Toast.LENGTH_LONG).show();
Log.v(TAG,
"ServiceonCreate");

mediaPlayer
= MediaPlayer.create(this, R.raw.test);

/*
* 要用MediaPlayer來建立,不能用MediaPlayer的對象來建立 // 不用帶後綴 mediaPlayer = new
* MediaPlayer(); mediaPlayer.create(this, R.raw.test);

*/

/*
* try { mediaPlayer.setDataSource("/sdcard/music/lost times.mp3");
* mediaPlayer.prepare();
*
*
* //方法二,從網上的連接獲取歌曲 try { mediaPlayer.setDataSource(
* "
http://www.yousss.com/uploadfile/mp3/2007-11/20071129134414713.mp3"
* );

*/

// mediaPlayer.setLooping(true);
}

@Override

public void onStart(Intent intent, int startId) {
// TODO Auto-generated method stub
super.onStart(intent, startId);
/*
* //能夠在OnCreate裏面建立與音樂的連接,也能夠在OnStart裏面建立 mediaPlayer =
* MediaPlayer.create(this, R.raw.test);

*/
Toast.makeText(this, "Play Service onStart", Toast.LENGTH_LONG).show();
Log.v(TAG,
"ServiceonStart");
mediaPlayer.start();
}

@Override

public void onDestroy() {
// TODO Auto-generated method stub
super.onDestroy();
Toast.makeText(
this, "Play Service Stopped", Toast.LENGTH_LONG).show();
Log.v(TAG,
"ServiconDestroy"); mediaPlayer.stop(); } }

相關文章
相關標籤/搜索