淺談android 之 service

  首先,讓我們確認下什麼是service?

   service就是android系統中的服務,它有這麼幾個特點:它無法與用戶直接進行交互、它必須由用戶或者其他程序顯式的啓動、它的優先級比較高,它比處於前臺的應用優先級低,但是比後臺的其他應用優先級高,這就決定了當系統因爲缺少內存而銷燬某些沒被利用的資源時,它被銷燬的概率很小

 那麼,什麼時候,我們需要使用service呢?

   我們知道,service是運行在後臺的應用,對於用戶來說失去了被關注的焦點。這就跟我們打開了音樂播放之後,便想去看看圖片,這時候我們還不想音樂停止,這裏就會用到service;又例如,我們打開了一個下載鏈接之後,我們肯定不想瞪着眼睛等他下載完再去做別的事情,對吧?這時候如果我們想手機一邊在後臺下載,一邊可以讓我去看看新聞啥的,就要用到service。
service分類:

       一般我們認爲service分爲兩類,本地service和遠程service。

   本地service顧名思義,那就是和當前應用在同一個進程中的service,彼此之間擁有共同的內存區域,所以對於某些數據的共享特別的方便和簡單;

   遠程service:主要牽扯到不同進程間的service訪問。因爲android的系統安全的原因導致了我們在不同的進程間無法使用一般的方式共享數據。在這裏android爲我們提供了一個AIDL工具。(android interface description language)android接口描述語言。

service生命週期:

    和Activity相比,service的生命週期已經簡單的不能再簡單了,只有onCreate()->onStart()->onDestroy()三個方法。

       Activity中和service有關的方法:
       startService(Intent intent):啓動一個service
       stopService(Intent intent) :停止一個
service

    如果我們想使用service中的一些數據或者訪問其中的一些方法,那麼我們就要通過下面的方法:

        public boolean bindService(Intent intent, ServiceConnection conn, int flags)
        public void unbindService(ServiceConnection conn);

        intent
是跳轉到service的intent,如 Intent intent = new Intent(); intent.setClass(this,MyService.class);

        conn則是一個代表與service連接狀態的類,當我們連接service成功或失敗時,會主動觸發其內部的onServiceConnected或onServiceDisconnected方法。如果我們想要訪問service中的數據,可以在onServiceConnected()方法中進行實現,例如


java代碼:

1.  /**

2.  * 鏈接到service時觸發。

3.  * name 鏈接到service組件的名稱

4.  * service 在service中調用onBund時返回的IBinder,主要用來進行信息的交流

5.  */

6.  @Override

7.  public void onServiceConnected(ComponentName name, IBinder service) {

8.  Log.i("通知", "鏈接成功!");

9.  MyBinder binder = (MyBinder)service;

10. MyService myService = binder.getMyService();

11. int count = myService.getCount();

12. Log.i("通知", "count="+count);

13.  

14. }


 使用service的步驟:

        第一步:我們要繼承service類,實現自己的service。

        如果想要訪問service中的某些值,我們通常會提供一個繼承了Binder的內部類,通過onBund()方法返回給service請求。這裏實際上巧妙的利用了內部類能夠訪問外部類屬性的特點。

        第二步:在androidManifest.xml中進行註冊,如:
        <!-- service配置開始 -->
        <service android:name="MyService"></service>
        <!-- service配置結束
-->

        第三步:在activity中進行啓動、綁定、解綁或者停止service。


        (很多書上說,service與用戶是不能交互的,其實這話很不正確,我們完全可以通過activity與service進行交互嘛!我覺得,確切的說法應該是service與用戶不能進行直接的交互)。

 

 

Service概念及用途:

  Service Android 系統中的一種組件,它和Activity 的級別差不多,但又Activity不同,它是不能與用戶交互的,但可以和其他組件進行交互。它不能自己運行,只能後臺運行。

  如果我們退出應用時,Service進程並沒有結束,它仍然在後臺運行,那我們什麼時候會用到Service呢?比如我們播放音樂的時候,有可能想邊聽音樂邊幹些其他事情,當我們退出播放音樂的應用,如果不用Service,我們就聽不到歌了,所以這時候就得用到Service了,又比如當我們一個應用的數據是通過網絡獲取的,不同時間(一段時間)的數據是不同的這時候我們可以用Service在後臺定時更新,而不用每打開應用的時候在去獲取。

  Service生命週期:

  Android Service的生命週期並不像Activity那麼複雜,它只繼承了onCreate(),onStart(),onDestroy()三個方法,當我們第一次啓動Service時,先後調用了onCreate(),onStart()這兩個方法,當停止Service時,則執行onDestroy()方法,這裏需要注意的是,如果Service已經啓動了,當我們再次啓動Service時,不會在執行onCreate()方法,而是直接執行onStart()方法,具體的可以看下面的實例。

  Service與Activity通信:

  Service後端的數據最終還是要呈現在前端Activity之上的,因爲啓動Service時,系統會重新開啓一個新的進程,這就涉及到不同進程間通信的問題了(AIDL)這一節我不作過多描述,當我們想獲取啓動的Service實例時,我們可以用到bindServiceonBindService方法,它們分別執行了ServiceIBinder()onUnbind()方法。

  Service 啓動方式:

  一、context.startService()

  二、context.bindService();

  使用Service之前必須在androidMainfest.xml 中註冊

  調用流程:

  第一種:

  啓動:context.startService() ---> onCreate() ---> onStartCommand()

  銷燬:ontext.stopService()   ---> onDestroy();

  如果Service還沒運行,則Android會先調用onCreate()方法,然後再調用onStartCommand();

  如果Service已經運行了,則只調用onStartCommand(),所以一個ServiceonStartCommand(),方法可能會調用多次。

  第二種:

  啓動:context.bindService() ---> onCreate() --->onBind();

  銷燬:onUnibind() ---> onDestroy()

  onBind() 將返回給客戶端一個IBind接口實例,IBind允許客戶端調用服務的方法,比如得到Service允許狀態或者其他操作這個時候調用者(Context,例如Activity)會和Service綁定在一起,Context退出了,Service就會調用onUnibind() ---> onDesytoy()相應退出

 

發佈了30 篇原創文章 · 獲贊 81 · 訪問量 24萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章