Android四大組件——Service

Service相關連接html

Service是Android系統中的一種組件,它跟Activity的級別差很少,可是它不能本身運行,只能後臺運行,而且能夠和其餘組件進行交互。Service是沒有界面的長生命週期的代碼。Service是一種程序,它能夠運行很長時間,可是它卻沒有用戶界面。這麼說有點枯燥,來看個例子,打開一個音樂播放器的程序,這個時候若想上網了,那麼,咱們打開Android瀏覽器,這個時候雖然咱們已經進入了瀏覽器程序,可是,歌曲播放並無中止,而是在後臺繼續一首接着一首地播放。其實這個播放就是由播放音樂的Service進行控制的。    
固然這個播放音樂的Service也能夠中止,例如,當播放列表裏邊的歌曲都結束,或者用戶按下了中止音樂播放的快捷鍵等。Service能夠在不少場合的應用中使用,好比播放多媒體的時候用戶啓動了其餘Activity,這個時候程序要在後臺繼續播放,好比檢測SD卡上文件的變化,再或者在後臺記錄用戶地理信息位置的改變等等。總之服務嘛,老是藏在後頭的。java

1、Service的生命週期及兩種啓動方式

service的生命週期比activity簡單多了,緣由是service是在後臺運行的,它是一直運行的,因此不須要那麼多的狀態判斷。它只繼承了onCreate()、onStart()或者說是onStartCommand()、 // 2.0 API level以後,實現onStart等同於重寫onStartCommand並返回  關於onStartCommon()的詳解:http://blog.csdn.net/lizzy115/article/details/7001731android

onDestroy()三個方法。 瀏覽器

Service的生命週期圖

生命週期解析app

好的,從上圖的生命週期,咱們能夠知道,Android中使用Service的方式有兩種:ide

1)StartService()啓動Service
2)BindService()啓動Service
PS:還有一種,就是啓動Service後,綁定Service!佈局

1)相關方法詳解:

  • onCreate():當Service第一次被建立後當即回調該方法,該方法在整個生命週期 中只會調用依次!
  • onDestory():當Service被關閉時會回調該方法,該方法只會回調一次!
  • onStartCommand(intent,flag,startId):早期版本是onStart(intent,startId), 當客戶端調用startService(Intent)方法時會回調,可屢次調用StartService方法, 但不會再建立新的Service對象,而是繼續複用前面產生的Service對象,但會繼續回調 onStartCommand()方法!
  • IBinder onOnbind(intent):該方法是Service都必須實現的方法,該方法會返回一個 IBinder對象,app經過該對象與Service組件進行通訊!
  • onUnbind(intent):當該Service上綁定的全部客戶端都斷開時會回調

2)兩種啓動方式

服務不能本身運行,須要經過調用Context.startService()或Context.bindService()方法啓動服務。這兩個方法均可以啓動Service,可是它們的使用場合有所不一樣。this

  1. 使用startService()方法啓用服務,調用者與服務之間沒有關連,即便調用者退出了,服務仍然運行。    若是打算採用Context.startService()方法啓動服務,在服務未被建立時,系統會先調用服務的onCreate()方法,接着調用onStart()方法。若是調用startService()方法前服務已經被建立,屢次調用startService()方法並不會致使屢次建立服務,但會致使屢次調用onStart()方法。 採用startService()方法啓動的服務,只能調用Context.stopService()方法結束服務,服務結束時會調用onDestroy()方法。
  2. 使用bindService()方法啓用服務,調用者與服務綁定在了一塊兒,調用者一旦退出,服務也就終止,大有「不求同時生,必須同時死」的特色。onBind()只有採用Context.bindService()方法啓動服務時纔會回調該方法。該方法在調用者與服務綁定時被調用,當調用者與服務已經綁定,屢次調用Context.bindService()方法並不會致使該方法被屢次調用。採用Context.bindService()方法啓動服務時只能調用onUnbind()方法解除調用者與服務解除,服務結束時會調用onDestroy()方法。

2、註冊Service

service的註冊跟activity的註冊相似,一樣是要在AndroidManifest.xml的文件裏註冊。spa

<service android:name=".MyService">
        <intent-filter>
                <action android:name="android.guo.service.playmusic.MyService"/>
            </intent-filter>
        </service>

 建立繼承與 Service 的類.net

public class MyService extends Service {
    @Override
    public IBinder onBind(Intent intent) {
        // TODO Auto-generated method stub
        return null;
}

   目前MyService 中能夠算是空空如也,但有一個onBind()方法特別醒目。這個方法是Service 中惟一的一個抽象方法,因此必需要在子類裏實現。咱們會在後面的小節中使用到onBind()方法,目前能夠暫時將它忽略掉。

       既然是定義一個服務,天然應該在服務中去處理一些事情了,那處理事情的邏輯應該寫在哪裏呢?這時就能夠重寫Service 中的另一些方法了,以下所示: 

public class MyService extends Service {  
  @Override  
  public IBinder onBind(Intent intent) {  
    // TODO Auto-generated method stub  
    return null;  
  }  
  @Override   
public void onCreate() {     // TODO Auto-generated method stub     super.onCreate();
    Log.v(
"MainActivity", "onCreate")   }
  @Override   
public void onStart(Intent intent, int startId) {     // TODO Auto-generated method stub     super.onStart(intent, startId);     Log.v("MainActivity", "onStart");   }
  @Override   
public void onDestroy() {     // TODO Auto-generated method stub     super.onDestroy();     Log.v("MainActivity", "onDestroy");   } }

        能夠看到,這裏咱們又重寫了onCreate()、onStartCommand()和onDestroy()這三個方法,它們是每一個服務中最經常使用到的三個方法了。其中onCreate()方法會在服務建立的時候調用,onStartCommand()方法會在每次服務啓動的時候調用,onDestroy()方法會在服務銷燬的時候調用。

     一般狀況下,若是咱們但願服務一旦啓動就馬上去執行某個動做,就能夠將邏輯寫在onStartCommand()方法裏。而當服務銷燬時,咱們又應該在onDestroy()方法中去回收那些再也不使用的資源。

     另外須要注意,每個服務都須要在AndroidManifest.xml 文件中進行註冊才能生效,不知道你有沒有發現,這是Android 四大組件共有的特色。因而咱們還應該修改AndroidManifest.xml文件,代碼以下所示: 

<service   
            android:name="cn.com.qiang.service.MyService">  
</service>  

 這樣的話,就已經將一個服務徹底定義好了。

 

3、啓動和中止一個服務

咱們在佈局文件中加入了兩個按鈕,分別是用於啓動服務和中止服務的。而後修改MainActivity 中的代碼,以下所示:

Button button1 = (Button)findViewById(R.id.button1);  
button1.setOnClickListener(new OnClickListener() {  
              
    @Override  
    public void onClick(View v) {  
        // TODO Auto-generated method stub  
        Intent startintent = new Intent(MainActivity.this,MyService.class);  
        startService(startintent);  
    }  
});  
          
Button button2 = (Button)findViewById(R.id.button2);  
button2.setOnClickListener(new OnClickListener() {  
              
    @Override  
    public void onClick(View v) {  
        // TODO Auto-generated method stub  
        Intent stopintent = new Intent(MainActivity.this,MyService.class);  
        stopService(stopintent);  
    }  
});   

咱們如何才能證明服務已經成功啓動或者中止了呢?最簡單的方法就是在MyService 的幾個方法中加入打印日誌,能夠看到咱們在MyService中已經加入了。

下面咱們看一下運行效果:

開啓服務後,LogCat中打印

關閉服務後,LogCat 中打印:

相關文章
相關標籤/搜索