91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Service詳解

發布時間:2020-06-10 09:43:57 來源:網絡 閱讀:166 作者:yym631 欄目:移動開發

service可以在和多場合的應用中使用,比如播放多媒體的時候用戶啟動了其他Activity這個時候程序要在后臺繼續播放,比如檢測SD卡上文件的變化,再或者在后臺記錄你地理信息位置的改變等等,總之服務嘛,總是藏在后頭的。


Service是在一段不定的時間運行在后臺,不和用戶交互應用組件。每個Service必須在manifest中 通過<service>來聲明。可以通過contect.startservice和contect.bindserverice來啟動。


Service和其他的應用組件一樣,運行在進程的主線程中。這就是說如果service需要很多耗時或者阻塞的操作,需要在其子線程中實現。


service的兩種模式(startService()/bindService()不是完全分離的):


    Context.startService(Intent intent) 

    Context.bindService(Intent intent, ServiceConnection conn, int flags)

    

    stopService(Intent intent)

    unbindService(ServiceConnection conn)

    

    1. 使用startService()方法啟用服務,調用者與服務之間沒有關連,即使調用者退出了,服務仍然運行。

    2. 使用bindService()方法啟用服務,調用者與服務綁定在了一起,調用者一旦退出,服務也就終止,大有“不求同時生,必須同時死”的特點。

----------------------------------------------------------    

本地服務 Local Service 用于應用程序內部。


    它可以啟動并運行,直至有人停止了它或它自己停止。在這種方式下,它以調用Context.startService()啟動,而以調用Context.stopService()結束。它可以調用Service.stopSelf() 或 Service.stopSelfResult()來自己停止。不論調用了多少次startService()方法,你只需要調用一次stopService()來停止服務。


  用于實現應用程序自己的一些耗時任務,比如查詢升級信息,并不占用應用程序比如Activity所屬線程,而是單開線程后臺執行,這樣用戶體驗比較好。


遠程服務 Remote Service 用于android系統內部的應用程序之間。


    它可以通過自己定義并暴露出來的接口進行程序操作。客戶端建立一個到服務對象的連接,并通過那個連接來調用服務。連接以調用Context.bindService()方法建立,以調用 Context.unbindService()關閉。多個客戶端可以綁定至同一個服務。如果服務此時還沒有加載,bindService()會先加載它。


  可被其他應用程序復用,比如天氣預報服務,其他應用程序不需要再寫這樣的服務,調用已有的即可。    

-----------------------------------------------------------------    


1.  在同一個應用任何地方調用 startService() 方法就能啟動 Service 了,然后系統會回調 Service 類的 onCreate() 以及 onStart() 方法。這樣啟動的 Service 會一直運行在后臺,直到 Context.stopService() 或者 selfStop() 方法被調用。另外如果一個 Service 已經被啟動,其他代碼再試圖調用 startService() 方法,是不會執行 onCreate() 的,但會重新執行一次 onStart() 。


2. bindService()方法的意思是,把這個Service和調用Service的客戶類綁起來,如果調用這個客戶類被銷毀,Service也會被銷毀。用這個方法的一個好處是,bindService()方法執行后Service會回調onBind()方發,它的作用是在Service和調用者之間建立一個橋梁,并不負責更多的工作,你可以從這里返回一個實現了IBind接口的類,在客戶端操作這個類就能和這個服務通信了,比如得到Service運行的狀態或其他操作。如果Service還沒有運行,使用這個方法啟動Service就會onCreate()方法而不會調用onStart()。一般使用bindService來綁定到一個現有的Service(即通過StartService啟動的服務)。


-----------------------------------------------------------------------


與Service通信并且讓它持續運行

    如果我們想保持和Service的通信,又不想讓Service隨著Activity退出而退出呢?你可以先startService()然后再bindService()。當你不需要綁定的時候就執行unbindService()方法,執行這個方法只會觸發Service的onUnbind()而不會把這個Service銷毀。這樣就可以既保持和Service的通信,也不會隨著Activity銷毀而銷毀了。



提高 Service 優先級

    Android 系統對于內存管理有自己的一套方法,為了保障系統有序穩定的運信,系統內部會自動分配,控制程序的內存使用。當系統覺得當前的資源非常有限的時候,為了保證一些優先級高的程序能運行,就會殺掉一些他認為不重要的程序或者服務來釋放內存。這樣就能保證真正對用戶有用的程序仍然再運行。如果你的 Service 碰上了這種情況,多半會先被殺掉。但如果你增加 Service 的優先級就能讓他多留一會,我們可以用setForeground(true) 來設置Service 的優先級。


    為什么是 foreground ? 默認啟動的Service是被標記為background,當前運行的Activity一般被標記為foreground,也就是說你給Service設置了foreground那么他就和正在運行的Activity類似優先級得到了一定的提高。當讓這并不能保證你得Service永遠不被殺掉,只是提高了他的優先級。

    

    

    優先級規則

    1. 如果service正在調用onCreate,onStartCommand或者onDestory方法,那么用于當前service的進程則變為前臺進程以避免被killed。

    2. 如果當前service已經被啟動(start),擁有它的進程則比那些用戶可見的進程優先級低一些,但是比那些不可見的進程更重要,這就意味著service一般不會被killed.

    3. 如果客戶端已經連接到service(bindService),那么擁有Service的進程則擁有最高的優先級,可以認為service是可見的。

    4. 如果service可以使用startForeground(int, Notification)方法來將service設置為前臺狀態,那么系統就認為是對用戶可見的,并不會在內存不足時killed。

    如果有其他的應用組件作為Service,Activity等運行在相同的進程中,那么將會增加該進程的重要性。

     

-----------------------------------------------------------------------------------


Service生命周


Android Service生命周期與Activity生命周期是相似的,但是也存在一些細節上也存在著重要的不同:


onCreate和onStart是不同的

    通過從客戶端調用Context.startService(Intent)方法我們可以啟動一個服務。如果這個服務還沒有運行,Android將啟動它并且在onCreate方法之后調用它的onStart方法。如果這個服務已經在運行,那么它的onStart方法將被新的Intent再次調用。所以對于單個運行的Service它的onStart方法被反復調用是完全可能的并且是很正常的。


onResume、onPause以及onStop是不需要的

    回調一個服務通常是沒有用戶界面的,所以我們也就不需要onPause、onResume或者onStop方法了。無論何時一個運行中的Service它總是在后臺運行。


onBind

    如果一個客戶端需要持久的連接到一個服務,那么他可以調用Context.bindService方法。如果這個服務沒有運行,將通過調用onCreate方法去創建這個服務但并不調用onStart方法來啟動它。相反,onBind方法將被客戶端的Intent調用,并且它返回一個IBind對象以便客戶端稍后可以調用這個服務。同一服務被客戶端同時啟動和綁定是很正常的。


onDestroy

    與Activity一樣,當一個服務被結束是onDestroy方法將會被調用。當沒有客戶端啟動或綁定到一個服務時Android將終結這個服務。與很多Activity時的情況一樣,當內存很低的時候Android也可能會終結一個服務。如果這種情況發生,Android也可能在內存夠用的時候嘗試啟動被終止的服務,所以你的服務必須為重啟持久保存信息,并且最好在onStart方法內來做。


使用context.startService() 啟動Service是會會經歷:

  context.startService() ->onCreate()- >onStart()->Service running

  context.stopService() | ->onDestroy() ->Service stop

    如果Service還沒有運行,則android先調用onCreate()然后調用onStart();如果Service已經運行,則只調用onStart(),所以一個Service的onStart方法可能會重復調用多次。


    stopService的時候直接onDestroy,如果是調用者自己直接退出而沒有調用stopService的話,Service會一直在后臺運行。該Service的調用者再啟動起來后可以通過stopService關閉Service。


  所以調用startService的生命周期為:onCreate --> onStart(可多次調用) --> onDestroy


使用使用context.bindService()啟動Service會經歷:

  context.bindService()->onCreate()->onBind()->Service running

  onUnbind() -> onDestroy() ->Service stop

    

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


  所以調用bindService的生命周期為:onCreate --> onBind(只一次,不可多次綁定) --> onUnbind --> onDestory。


    在Service每一次的開啟關閉過程中,只有onStart可被多次調用(通過多次startService調用),其他onCreate,onBind,onUnbind,onDestory在一個生命周期中只能被調用一次。

----------------------------------------

Service和Thread的區別

我們拿服務來進行一個后臺長時間的動作,為了不阻塞線程,然而,Thread就可以達到這個效果,為什么我們不直接使用Thread去代替服務呢?(這個問題摘抄至網上,原文地址不是是哪個,所以沒寫上)

這里提下,

 

1). Thread:Thread 是程序執行的最小單元,它是分配CPU的基本單位。可以用 Thread 來執行一些異步的操作。

2). Service:Service 是android的一種機制,當它運行的時候如果是Local Service,那么對應的 Service 是運行在主進程的 main 線程上的。如:onCreate,onStart 這些函數在被系統調用的時候都是在主進程的 main 線程上運行的。如果是Remote Service,那么對應的 Service 則是運行在獨立進程的 main 線程上。因此請不要把 Service 理解成線程,它跟線程半毛錢的關系都沒有!

 

既然這樣,那么我們為什么要用 Service 呢?其實這跟 android 的系統機制有關,我們先拿 Thread 來說。Thread 的運行是獨立于 Activity 的,也就是說當一個 Activity 被 finish 之后,如果你沒有主動停止 Thread 或者 Thread 里的 run 方法沒有執行完畢的話,Thread 也會一直執行。因此這里會出現一個問題:當 Activity 被 finish 之后,你不再持有該 Thread 的引用。另一方面,你沒有辦法在不同的 Activity 中對同一 Thread 進行控制。


舉個例子:如果你的 Thread 需要不停地隔一段時間就要連接服務器做某種同步的話,該 Thread 需要在 Activity 沒有start的時候也在運行。這個時候當你 start 一個 Activity 就沒有辦法在該 Activity 里面控制之前創建的 Thread。因此你便需要創建并啟動一個 Service ,在 Service 里面創建、運行并控制該 Thread,這樣便解決了該問題(因為任何 Activity 都可以控制同一 Service,而系統也只會創建一個對應 Service 的實例)。


因此你可以把 Service 想象成一種消息服務,而你可以在任何有 Context 的地方調用 Context.startService、Context.stopService、Context.bindService,Context.unbindService,來控制它,你也可以在 Service 里注冊 BroadcastReceiver,在其他地方通過發送 broadcast 來控制它,當然這些都是 Thread 做不到的。





<manifest ... >

  ...

  <application ... >

      <service android:name=".ExampleService" />

      ...

  </application>

</manifest>


向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

仁化县| 岳池县| 夏河县| 迭部县| 凤阳县| 苍溪县| 梁平县| 南澳县| 肥西县| 靖州| 定安县| 南丹县| 乌海市| 板桥市| 旌德县| 积石山| 宜都市| 怀柔区| 上高县| 稻城县| 华阴市| 凌海市| 宝应县| 广水市| 新安县| 双柏县| 广元市| 大冶市| 商河县| 吉林市| 昔阳县| 金塔县| 河池市| 大安市| 卢龙县| 吉木萨尔县| 五指山市| 应城市| 昌江| 虞城县| 留坝县|