❶ Android Service啟動方式
1.startService
①.定義一個類繼承service
②.在manifest.xml文件中配置該service
③.使用context的startService(intent)啟動該service
④.不再使用時,調用stopService(Intent)停止該服務
2.bindService
①.創建bindService服務段,繼承自service並在類中,創建一個實現binder介面的實例對象並提供公共方法給客戶端調用
②.從onbind()回調方法返回此binder實例
③.在客戶端中,從onserviceconnected()回調方法接收binder,並使用提供的方法調用綁定服務
❷ Service的啟動方式
對service有點了解的朋友肯定都會知道服務有兩種啟動方式,即startService和bindService。那麼這兩種服務有什麼區別呢?
startService的特點:
啟動方式:
在其它組件中通過startService()方法啟動。
停止方式:
在其它組件中通過stopService()方法停止,或者在service中調用stopSelf()方法停止.
生命周期:
onCreate()--->onStartCommand()(onStart()方法已過時) ---> onDestory()
一旦啟動,service即可在後台無限期運行,即使啟動service的組件已經被銷毀也不受影響,直到其被停止.
說明:如果服務已經開啟,不會重復的執行onCreate(), 而是會調用onStart()和onStartCommand()。
服務停止的時候調用 onDestory()。服務只會被停止一次。
與其它組件的通信方式:
沒有提供默認的通信方式,啟動service後該service就處於獨立運行狀態
使用步驟:
(1)定義一個繼承service的類
(2)在配置文件Manifest.xml中配置該service
(3)使用context調用startService(Intent)方法啟動該service
(4)不再使用時,調用stopService(Intent)方法停止該服務
bindService的特點:
啟動方式:
在其它組件中通過bindService()方法啟動。
停止方式:
所有綁定service的組件都被銷毀,或者所有綁定service的組件都調用了unbindService方法後會停止
生命周期:
onCreate() --->onBind()--->onunbind()--->onDestory()
一旦啟動,只有當所有綁定service的組件都被銷毀,或者所有綁定service的組件都調用了unbindService方法後才會停止
說明:bind的方式開啟服務,綁定服務,調用者掛了,服務也會跟著掛掉。綁定者可以調用服務裡面的方法
與其它組件的通信方式:
可以通過 ServiceConnection進行通信,組件可以與service進行交互、發送請求、獲取結果,甚至是利用IPC跨進程執行這些操作
使用步驟:
(1)定義一個繼承service的類
(2)在配置文件Manifest.xml中配置該service
(3)使用context調用bindService(Intent, ServiceConnection, int)方法啟動該service
(4)不再使用時,調用unbindService(ServiceConnection)方法停止該服務
❸ Android基礎:Service —— 默默為你服務
Service有兩種啟動方式,分別為 context.startService() 和 context.bindService() 。這里要提到Service的生命周期,兩種不同的啟動方式有不同的生命周期:
Tips:
首先創建自己的Service類,重寫其生命周期,並在mainfest.xml中進行注冊。
必須注冊Service,不然不會調用。簡單注冊:
補充下Service在manifest中的屬性以及作用:
接下來,我們就可以用下面的兩個方法來啟動和停止服務。
首先在我們的Activity中創建Service連接對象,重寫連接和斷開的方法。創建自定義的Binder對象,在 onServiceConnected() 中賦值然後可以調用自定義Binder中的方法。使用下方的bind()方法來綁定服務,使用 unBind() 來解綁服務。
這里會用到Service的 onBind() 和 onUnbind() 的生命周期,我們在TestService中重寫之。這里要注意的是,使用bindService()方法啟動的Service,不會調用 onStartCommand() 的生命周期。此外,創建自定義Binder類和對象。
這樣,當我們使用Activity中的bind()方法來綁定服務,會自動啟動服務,而我們又重寫了 onServiceConnected() 方法並使用myBinder來調用方法。這樣我們就可以用它來Activity和Service來進行通信。
特別Tips:
如果先使用 startService() 來開啟服務和 bindService() 來綁定服務,當使用 unbindService() 解綁時,Service並不會被銷毀。而是使用 stopService() 才能銷毀服務。
前台服務和後台服務的區別:
在Service中進行操作,將服務類型以前台的方式運行顯示在通知欄。
運行效果:
暫時引用吧,有空再實現一個:
參考資料:
❹ kubernetes(九) Service介紹、類型及使用
在kubernetes中,pod是應用程序的載體,我們可以通過pod的ip來訪問應用程序,但是pod的ip地址不是固定的,這也就意味著不方便直接採用pod的ip對服務進行訪問。
為了解決這個問題,kubernetes提供了Service資源,Service會對提供同一個服務的多個pod進行聚合,並且提供一個統一的入口地址。通過訪問Service的入口地址就能訪問到後面的pod服務。
Service在很多情況下只是一個概念,真正起作用的其實是kube-proxy服務進程,每個Node節點上都運行著一個kube-proxy服務進程。當創建Service的時候會通過api-server向etcd寫入創建的service的信息,而kube-proxy會基於監聽的機制發現這種Service的變動,然後 它會將最新的Service信息轉換成對應的訪問規則 。
規則有iptables,ipvs等,簡單介紹下ipvs規則
10.97.97.97:80 是service提供的訪問入口,當訪問這個入口的時候,可以發現後面有三個pod 的服務在等待調用,kube-proxy 會基於rr(輪詢)的策略,將請求分發到其中一個pod上去,這個規則會同時在集群內的所有節點上都生成,所以在任何一個節點上訪問都可以。
kube-proxy目前支持三種工作模式:
userspace 模式
userspace模式下,kube-proxy會為每一個Service創建一個監聽埠,發向Cluster IP的請求被Iptables規則重定向到kube-proxy監聽的埠上,kube-proxy根據LB演算法選擇一個提供服務的Pod並和其建立鏈接,以將請求轉發到Pod上。 該模式下,kube-proxy充當了一個四層負責均衡器的角色。由於kube-proxy運行在userspace中,在進行轉發處理時會增加內核和用戶空間之間的數據拷貝,雖然比較穩定,但是效率比較低。
iptables 模式
iptables模式下,kube-proxy為service後端的每個Pod創建對應的iptables規則,直接將發向Cluster IP的請求重定向到一個Pod IP。 該模式下kube-proxy不承擔四層負責均衡器的角色,只負責創建iptables規則。該模式的優點是較userspace模式效率更高,但不能提供靈活的LB策略,當後端Pod不可用時也無法進行重試。
ipvs 模式
ipvs模式和iptables類似,kube-proxy監控Pod的變化並創建相應的ipvs規則。ipvs相對iptables轉發效率更高。除此以外,ipvs支持更多的LB演算法。
此模式必須安裝ipvs內核模塊,否則會降級為iptables,開啟ipvs
Service的資源清單文件:
type:
在使用service之前,首先利用Deployment創建出3個pod,注意要為pod設置 app=nginx-pod 的標簽
創建deployment.yaml,內容如下:
是集群內部地址,只能通過Node集群內部訪問,創建service-clusterip.yaml文件
Endpoint
Endpoint是kubernetes中的一個資源對象,存儲在etcd中,用來記錄一個service對應的所有pod的訪問地址,它是根據service配置文件中selector描述產生的。
一個Service由一組Pod組成,這些Pod通過Endpoints暴露出來, Endpoints是實現實際服務的端點集合 。換句話說,service和pod之間的聯系是通過endpoints實現的。
負載分發策略
對Service的訪問被分發到了後端的Pod上去,目前kubernetes提供了兩種負載分發策略:
在某些場景中,開發人員可能不想使用Service提供的負載均衡功能,而希望自己來控制負載均衡策略,針對這種情況,kubernetes提供了HeadLiness Service,這類Service不會分配Cluster IP,如果想要訪問service,只能通過service的域名進行查詢。
創建service-headliness.yaml
在之前的樣例中,創建的Service的ip地址只有集群內部才可以訪問,如果希望將Service暴露給集群外部使用,那麼就要使用到另外一種類型的Service,稱為NodePort類型。NodePort的工作原理其實就是 將service的埠映射到Node的一個埠上 ,然後就可以通過 NodeIp:NodePort 來訪問service了。
創建service-nodeport.yaml
LoadBalancer和NodePort很相似,目的都是向外部暴露一個埠,區別在於LoadBalancer會在集群的外部再來做一個負載均衡設備,而這個設備需要外部環境支持的,外部服務發送到這個設備上的請求,會被設備負載之後轉發到集群中。
ExternalName類型的Service用於引入集群外部的服務,它通過 externalName 屬性指定外部一個服務的地址,然後在集群內部訪問此service就可以訪問到外部的服務了。
❺ Android應用組件 —— Service
官方原文: 地址
本文摘錄自官方原文,方便自己觀看。
service 是一個可以在後台長時間運行的操作而不提供用戶界面的應用組件。服務可以由其他應用組件啟動,而且即使用戶切換到其他應用程序,服務仍將在後台繼續運行。此外,組件可以綁定到服務,以與之進行交互,甚至執行進程間的通信(IPC)
服務基本分為兩種形式:
啟動
綁定
上述雖然分開概括這兩種服務,但是服務可以同時以這兩種方式運行,也就是說,他既可以是啟動服務(以無限期運行),也允許綁定。問題在於是否實現了一組回調方法: onStartCommand() (允許組件啟動服務)和 onBing() (允許綁定服務)。
無論應用是出於啟動狀態還是綁定狀態,亦或處於啟動並且綁定狀態,任何應用組件均可以像使用Activity那麼調用Itent來使用服務(即使此服務來自另一應用)。 不過,您可以通過清單文件將服務聲明為私有服務,並阻止其他應用訪問。 使用清單文件聲明服務部分將對此做更詳盡的闡述。
注意:
服務在其託管進程的主線程中運行,它既不創建自己的線程,也不在單獨的進程中運行(除非另行指定)。這意味著,如果服務將執行任何CPU密集型工作或者阻止性操作(我理解為耗時操作,例如 MP3 播放或聯網),則應在服務內創建新線程來完成這項工作。通過使用單獨的線程,可以降低發生「應用無響應」(ANR) 錯誤的風險,而應用的主線程仍可繼續專注於運行用戶與 Activity 之間的交互。
要創建服務,您必須創建 Service 的子類(或使用它的一個現有子類)。在實現中,您需要重寫一些回調方法,以處理服務生命周期的某些關鍵方面並提供一種機制將組件綁定到服務(如適用)。 應重寫的最重要的回調方法包括:
onStartCommand()
onBind()
onCreate()
onDestroy()
如果組件通過調用 startService() 啟動服務(這會導致對 onStartCommand() 的調用),則服務將一直運行,直到服務使用 stopSelf() 自行停止運行,或由其他組件通過調用 stopService() 停止它為止。
如果組件是通過調用 bindService() 來創建服務(且未調用 onStartCommand() ,則服務只會在該組件與其綁定時運行。一旦該服務與所有客戶端之間的綁定全部取消,系統便會銷毀它。
如同 Activity(以及其他組件)一樣,您必須在應用的清單文件中聲明所有服務。
要聲明服務,請添加 <service> 元素作為 <application> 元素的子元素。例如:
為了確保應用的安全性, 請始終使用顯式 Intent 啟動或綁定 Service,且不要為服務聲明 Intent 過濾器。 啟動哪個服務存在一定的不確定性,而如果對這種不確定性的考量非常有必要,則可為服務提供 Intent 過濾器並從 Intent 中排除相應的組件名稱,但隨後必須使用 setPackage() 方法設置 Intent 的軟體包,這樣可以充分消除目標服務的不確定性。
此外,還可以通過添加 android:exported 屬性並將其設置為 "false" ,確保服務僅適用於您的應用。這可以有效阻止其他應用啟動您的服務,即便在使用顯式 Intent 時也如此
Service
IntentService
簡單地說,服務是一種即使用戶未與應用交互也可在後台運行的組件。 因此,您應僅在必要時才創建服務。
如需在主線程外部執行工作,不過只是在用戶正在與應用交互時才有此需要,則應創建新線程而非服務。 例如,如果您只是想在 Activity 運行的同時播放一些音樂,則可在 onCreate() 中創建線程,在 onStart() 中啟動線程,然後在 onStop() 中停止線程。您還可以考慮使用 AsyncTask 或 HandlerThread,而非傳統的 Thread 類。
前台服務被認為是用戶主動意識到的一種服務,因此在內存不足時,系統也不會考慮將其終止。 前台服務必須為狀態欄提供通知,放在「正在進行」標題下方,這意味著除非服務停止或從前台移除,否則不能清除通知。
要請求讓服務運行於前台,請調用 startForeground() 。此方法採用兩個參數:唯一標識通知的整型數和狀態欄的 Notification 。例如:
注意 :提供給 startForeground() 的整型 ID 不得為 0。
要從前台移除服務,請調用 stopForeground() 。此方法採用一個布爾值,指示是否也移除狀態欄通知。 此方法不會停止服務。 但是,如果您在服務正在前台運行時將其停止,則通知也會被移除。
與 Activity 類似,服務也擁有生命周期回調方法,您可以實現這些方法來監控服務狀態的變化並適時執行工作。 以下框架服務展示了每種生命周期方法:
注 :與 Activity 生命周期回調方法不同,您 不 需要調用這些回調方法的超類實現。
注 :盡管啟動服務是通過調用 stopSelf() 或 stopService() 來停止,但是該服務並無相應的回調(沒有 onStop() 回調)。因此,除非服務綁定到客戶端,否則在服務停止時,系統會將其銷毀 — onDestroy() 是接收到的唯一回調。
❻ Service 理解和兩種啟動方式
Service 作為android系統的四大組件之一,是一種可以在後台長時間運行操作而沒有用戶界面的應用組件。
1、Thread是程序運行的最小單位即線程,可以執行非同步長時間耗時的操作。
2、Service是android中的組件,是運行在主線程上的,是要依託android程序運行的,所以不能做耗時操作。
Service android是四大組件之一。Service 是一個抽象類,我們需要些一個自定義Service繼承於Service。
Service 的啟動方式有兩種,一種是startService(),一種是bindService().這兩種方式有有什麼區別.
Service 的生命周期跟啟動方式有關。
stratService的生命周期: onCreate() -> onStartCommand() -> onDestroy()
bindService的生命周期: onCreate() -> onBind() -> onUnbind() -> onDestroy()
用startService 方式啟動Service的時候重寫onStartCommand()的方法。每次用該方式啟動Service的時候都會調用改方法。
返回值是一個int類型的:
這里的參數是:
startService的完整Service:
調用也就是簡單的startService:
bindService 的方式啟動Service,其作用是該Service可以和啟動它的Context(Activity等)進行通訊。其是ServiceConnection()的介面方法和伺服器交互,在綁定即onBind()的時候回調。在這個方法中獲取Service傳遞過來的IBinder對象,通過這個對象實現跟宿主交互。
BindService的Service:
調用的方式:先創建ServiceConnection:
調用方式不同;
使用Service的步驟:
1.定義一個類繼承 Service
2.在 Manifest.xml 文件中配置該 Service
3.使用Context的 startService(Intent) 方法啟動該Service
4.不再使用時,調用 stopService(Intent) 方法停止該服務
使用這種start方式啟動的Service的 生命周期 如下:
onCreate() ---> onStartCommand() ( onStart() 方法已過時) ---> onDestory()
說明 :如果服務已經開啟,不會重復的執行 onCreate() , 而是會調用 onStart() 和 onStartCommand() 。
服務停止的時候調用 onDestory() 。服務只會被停止一次。
特點 :一旦服務開啟跟調用者(開啟者)就沒有任何關系了。開啟者退出了,開啟者掛了,服務還在後台長期的運行。開啟者 不能調用 服務裡面的方法。
使用Service的步驟:
使用這種start方式啟動的Service的 生命周期 如下:
onCreate() ---> onBind() ---> onunbind() ---> onDestory()
注意 :綁定服務不會調用 onstart() 或者 onstartcommand() 方法
特點 :bind的方式開啟服務,綁定服務,調用者掛了,服務也會跟著掛掉。
綁定者可以調用服務裡面的方法。
❼ Android中怎麼啟動關閉Service及功能解釋
調用startService就是啟動service,調用stopService就是關閉service。
android中Service是運行在後台的東西,級別與activity差不多。既然說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()會先載入它。