Android服务之Service(其一)
轉(zhuǎn)載地址:http://www.cnblogs.com/zhangdongzi/archive/2012/01/08/2316711.html
android中服務(wù)是運行在后臺的東西,級別與activity差不多。既然說service是運行在后臺的服務(wù),那么它就是不可見的,沒有界面的東西。你可以啟動一個服務(wù)Service來播放音樂,或者記錄你地理信息位置的改變,或者啟動一個服務(wù)來運行并一直監(jiān)聽某種動作。
Service和其他組件一樣,都是運行在主線程中,因此不能用它來做耗時的請求或者動作。你可以在服務(wù)中開一一個線程,在線程中做耗時動作。
那么究竟Service怎么使用呢?
老規(guī)矩,先來點基礎(chǔ)知識。
一.基礎(chǔ)知識
服務(wù)一般分為兩種:
1:本地服務(wù),?Local Service 用于應(yīng)用程序內(nèi)部。在Service可以調(diào)用Context.startService()啟動,調(diào)用Context.stopService()結(jié)束。在內(nèi)部可以調(diào)用Service.stopSelf() 或 Service.stopSelfResult()來自己停止。無論調(diào)用了多少次startService(),都只需調(diào)用一次stopService()來停止。
2:遠程服務(wù), Remote Service 用于android系統(tǒng)內(nèi)部的應(yīng)用程序之間。可以定義接口并把接口暴露出來,以便其他應(yīng)用進行操作。客戶端建立到服務(wù)對象的連接,并通過那個連接來調(diào)用服務(wù)。調(diào)用Context.bindService()方法建立連接,并啟動,以調(diào)用 Context.unbindService()關(guān)閉連接。多個客戶端可以綁定至同一個服務(wù)。如果服務(wù)此時還沒有加載,bindService()會先加載它。
提供給可被其他應(yīng)用復(fù)用,比如定義一個天氣預(yù)報服務(wù),提供與其他應(yīng)用調(diào)用即可。
那么先來看Service的生命周期吧:如圖:
?
context.startService() ->onCreate()- >onStart()->Service running--調(diào)用context.stopService() ->onDestroy()
context.bindService()->onCreate()->onBind()->Service running--調(diào)用>onUnbind() -> onDestroy() 從上訴可以知道分別對應(yīng)本地的,,以及遠程的,也對應(yīng)不同的方式啟動這個服務(wù)。
二.實戰(zhàn)
我們可以定義一個本地服務(wù)繼承Service,然后在這個服務(wù)里播放媒體播放器或者記錄地理位置變化。通常有時候我們的Service要與Activity交互,那么可以可以定義一個內(nèi)部類,返回這個Service,當(dāng)然我們要考慮到如果是以綁定方式啟動服務(wù),那么內(nèi)部類可以定義為繼承Binder,然后返回本地服務(wù),具體代碼如下。
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();@Overridepublic 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(); } //定義內(nèi)容類繼承Binderpublic class LocalBinder extends Binder{//返回本地服務(wù) LocalService getService(){return LocalService.this;}}}?
我們可以從上面知道
?//定義內(nèi)容類繼承Binder
??? public class LocalBinder extends Binder{
?? ??? ?//返回本地服務(wù)
?? ??? ?LocalService getService(){
?? ??? ??? ?return LocalService.this;
?? ??? ?}
??? }
可以返回這個服務(wù),然后activity可以通過服務(wù)調(diào)用服務(wù)的方法了。
那么如何啟動服務(wù)呢?從上面基礎(chǔ)知識中,我們知道有2種方法,如下:
//啟動服務(wù)private void startCustomService(){Intent intent=new Intent(this,LocalService.class);startService(intent);?
第2種綁定方式:
LocalService localService=null;//用bindService方法啟動服務(wù)private void BinderService(){Intent intent=new Intent(this,LocalService.class);bindService(intent, new ServiceConnection(){@Overridepublic void onServiceConnected(ComponentName componentName, IBinder binder) {//調(diào)用bindService方法啟動服務(wù)時候,如果服務(wù)需要與activity交互,//則通過onBind方法返回IBinder并返回當(dāng)前本地服務(wù)localService=((LocalService.LocalBinder)binder).getService();//這里可以提示用戶,或者調(diào)用服務(wù)的某些方法 }@Overridepublic void onServiceDisconnected(ComponentName componentName) {localService=null;//這里可以提示用戶 } }, Context.BIND_AUTO_CREATE);}?
在綁定服務(wù)的時候,需要一個服務(wù)連接對象,ServiceConnection,服務(wù)一旦連接,就會調(diào)用onServiceConnected方法,我們可以在這個方法里面返回我們的本地服務(wù)對象,具體看代碼;而在服務(wù)斷開時候會調(diào)用onServiceDisconnected方法,我們可以清理一些服務(wù)資源。
接下來,我們會講解一些AIDL的一些知識。這些與服務(wù)息息相關(guān)。
轉(zhuǎn)載于:https://www.cnblogs.com/songyao/p/4142026.html
總結(jié)
以上是生活随笔為你收集整理的Android服务之Service(其一)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: PHP自动加载类的实例
- 下一篇: Android应用程序窗口(Activi