Android服務之Service

來源:互聯網
上載者:User

標籤:des   android   style   blog   http   io   ar   color   os   

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種方法,如下:

//啟動服務    private void startCustomService(){         Intent intent=new Intent(this,LocalService.class);         startService(intent);    }

 

第2種綁定方式:

LocalService localService=null;    //用bindService方法啟動服務    private void BinderService(){         Intent intent=new Intent(this,LocalService.class);         bindService(intent, new ServiceConnection(){            @Override            public void onServiceConnected(ComponentName componentName, IBinder binder) {                //調用bindService方法啟動服務時候,如果服務需要與activity互動,                //則通過onBind方法返回IBinder並返回當前本地服務                localService=((LocalService.LocalBinder)binder).getService();                //這裡可以提示使用者,或者調用服務的某些方法            }            @Override            public void onServiceDisconnected(ComponentName componentName) {                localService=null;                //這裡可以提示使用者            }              }, Context.BIND_AUTO_CREATE);    }

 

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


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

 

轉自:http://www.cnblogs.com/zhangdongzi/archive/2012/01/08/2316711.html

Android服務之Service

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.