閱讀918 返回首頁    go 阿裏雲 go 技術社區[雲棲]


android之service

android中服務是運行在後台的東西,級別與activity差不多。既然說service是運行在後台的服務,那麼它就是不可見的,沒有界麵的東西。你可以啟動一個服務Service來播放音樂,或者記錄你地理信息位置的改變,或者啟動一個服務來運行並一直監聽某種動作。

Service和其他組件一樣,都是運行在主線程中,因此不能用它來做耗時的請求或者動作。你可以在服務中開一一個線程,在線程中做耗時動作。

那麼究竟Service怎麼使用呢?

老規矩,先來點基礎知識。

一.基礎知識

服務一般分為兩種:

1:本地服務 Local Service 用於應用程序內部。在Service可以調用Context.startService()啟動,調用Context.stopService()結束。在內部可以調用Service.stopSelf() 或 Service.stopSelfResult()來自己停止。無論調用了多少次startService(),都隻需調用一次stopService()來停止。

2:遠程服務, Remote Service 用於android係統內部的應用程序之間。可以定義接口並把接口暴露出來,以便其他應用進行操作。客戶端建立到服務對象的連接,並通過那個連接來調用服務。調用Context.bindService()方法建立連接,並啟動,以調用 Context.unbindService()關閉連接。多個客戶端可以綁定至同一個服務。如果服務此時還沒有加載,bindService()會先加載它。
提供給可被其他應用複用,比如定義一個天氣預報服務,提供與其他應用調用即可。

那麼先來看Service的生命周期吧:如圖:


context.startService() ->onCreate()- >onStart()->Service running--調用context.stopService() ->onDestroy()

context.bindService()->onCreate()->onBind()->Service running--調用>onUnbind() -> onDestroy() 從上訴可以知道分別對應本地的,,以及遠程的,也對應不同的方式啟動這個服務。

二.實戰

我們可以定義一個本地服務繼承Service,然後在這個服務裏播放媒體播放器或者記錄地理位置變化。通常有時候我們的Service要與Activity交互,那麼可以可以定義一個內部類,返回這個Service,當然我們要考慮到如果是以綁定方式啟動服務,那麼內部類可以定義為繼承Binder,然後返回本地服務,具體代碼如下。

複製代碼
package com.dongzi;

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

public class LocalService extends Service {

    private static final String TAG = "LocalService"; 
    private IBinder binder=new LocalService.LocalBinder();
    
    @Override
    public IBinder onBind(Intent intent) {
         
        return binder;
    }
    MediaPlayer mediaPlayer=null;
    @Override 
    public void onCreate() { 
            Log.i(TAG, "onCreate"); 
            //這裏可以啟動媒體播放器
           // if(mediaPlayer==null)
           //     mediaPlayer=MediaPlayer.create(this, uri);
            super.onCreate(); 
    } 

    @Override 
    public void onStart(Intent intent, int startId) { 
            Log.i(TAG, "onStart"); 
            super.onStart(intent, startId); 
    } 

    @Override 
    public int onStartCommand(Intent intent, int flags, int startId) { 
          Log.i(TAG, "onStartCommand"); 
        return START_STICKY;
    }

    
    
    @Override 
    public void onDestroy() { 
            Log.i(TAG, "onDestroy"); 
            super.onDestroy(); 
    } 

    
    //定義內容類繼承Binder
    public class LocalBinder extends Binder{
        //返回本地服務
        LocalService getService(){
            return LocalService.this;
        }
    }
    
    
}
複製代碼

我們可以從上麵知道

 //定義內容類繼承Binder
    public class LocalBinder extends Binder{
        //返回本地服務
        LocalService getService(){
            return LocalService.this;
        }
    }

可以返回這個服務,然後activity可以通過服務調用服務的方法了。

那麼如何啟動服務呢?從上麵基礎知識中,我們知道有2種方法,如下:

View Code

第2種綁定方式:

View Code

在綁定服務的時候,需要一個服務連接對象,ServiceConnection,服務一旦連接,就會調用onServiceConnected方法,我們可以在這個方法裏麵返回我們的本地服務對象,具體看代碼;而在服務斷開時候會調用onServiceDisconnected方法,我們可以清理一些服務資源。


接下來,我們會講解一些AIDL的一些知識。這些與服務息息相關。

最後更新:2017-04-03 12:54:38

  上一篇:go Sql Server 存儲過程基礎
  下一篇:go Java中的cookie(3)——cookie中存取中文