android服務綁定
Ⅰ Android 之 Service(一)啟動,綁定服務
Service(服務)一個運行在後台執行長時間運行的操作組件,它不提供任何用戶界面,作為與Activity同級的組件,它依舊是運行在主線程中。
其它組件可以啟動一個Service,當這個Service啟動之後便會在後台執行,這里需要注意,由於是在主線程中,所以我們需要另外開啟一個線程來執行我們的耗時操作。
此外,一個組件還可以與一個Service進行綁定來實現組件之間的交互,甚至可以執行IPC(Inter-Process Communication)進程間通信。
Service可以在後台執行很多任務,比如處理網路事務,播放音樂,文件讀寫或者與一個內容提供者交互,等等。
本地服務(Local)
該服務依附在主進程上而不是獨立的進程,這樣在一定程度上節約了資源,另外本地服務因為是在同一進程因此不需要IPC,也不需要AIDL。相應bindService會方便很多,當主進程被Kill後,服務便會終止。一般使用在音樂播放器播放等不需要常駐的服務。
遠程服務(Remote Service)
該服務是獨立的進程,對應進程名格式為所在包名加上你指定的android:process字元串。一般定義方式 android:process=":service" 由於是獨立的進程,因此在Activity所在進程被Kill的時候,該服務依然在運行,不受其他進程影響,有利於為多個進程提供服務具有較高的靈活性。由於是獨立的進程,會佔用一定資源,並且使用AIDL進行IPC比較麻煩。一般用於系統的Service,這種Service是常駐的。
startService啟動的服務
用於啟動一個服務執行後台任務,不與組件進行通信,停止服務使用stopService。 當一個應用組件比如activity通過調用startService()來啟動一個服務的時候,服務便處於啟動狀態。一旦啟動,服務可以在後台無限期地運行下去,即使當啟動它的組件已經銷毀。通常情況下,一個啟動的service執行一個單一的操作並且不會返回任何結果給調用者。
bindService啟動的服務
用於啟動的服務需要進行通信。停止服務使用unbindService。 當一個應用組件通過調用bindService()來與一個服務綁定時,服務便處於綁定狀態。一個綁定的服務提供了一個客戶端-伺服器端介面來允許組件與服務進行交互,發送請求,得到結果甚至通過IPC進程間通信來完成操作。只有當其它組件與服務進行綁定時,服務才會處於綁定狀態。多個組件可以同時與服務綁定,但是當他們全部都解除綁定時,服務就會銷毀。
2.BindService:
如果一個Service在某個Activity中被調用bindService方法啟動,不論bindService被調用幾次,Service的 onCreate 方法只會執行一次,同時 onStartCommand 方法始終不會調用。當建立連接後,Service會一直運行,除非調用unbindService來接觸綁定、斷開連接或調用該Service的Context不存在了(如Activity被Finish——即通過bindService啟動的Service的生命周期依附於啟動它的Context),系統在這時會自動停止該Service。
3.StartService AND BindService:
當一個Service在被啟動(startService 的同時又被綁定(bindService ),該Service將會一直在後台運行,並且不管調用幾次, onCreate 方法始終只會調用一次, onStartCommand 的調用次數與startService 調用的次數一致(使用bindService 方法不會調用 onStartCommand )。同時,調用unBindService 將不會停止Service,必須調用stopService 或Service自身的stopSelf 來停止服務。
4.停止Service:
當一個服務被終止(stopService 、stopSelf 、unbindService )時, onDestory 方法將會被調用——所以我們需要在該方法中清除一些工作(依附該Service生命周期上的,比如:停止在Service中創建並運行的線程)。
1.創建服務
如果你才用的是 startService的方式那麼 onBind方法可以忽略
2.注冊服務
3.開啟服務
start:
bind
綁定服務,一般涉及到組件或進程之間的通信,既然需要通信,那麼我們肯定需要一個連接,這里ServiceConnection就是我們所需要的連接,通過Ibinder的傳遞,我們可以獲取到Service的Ibinder對象,從而進行相關操作。
關於粘性服務,這里需要提到 Service的onStartCommand返回值
andorid:name
adroid:exported
android:enabled
android:label
android:process
android:icon
android:permission
關於服務,當我們在應用開發中,如果需要長時間的在後台運行,獨立完成某一些事情的情況下,請使用Service!
此文綜合: http://www.jianshu.com/p/1e49e93c3ec8 以及自己的一些問題看法,用作學習,回顧之用。
Service 前台服務
請參看 紫豪 http://www.jianshu.com/p/5505390503fa
Ⅱ Android中服務service
本文原文連接 https://blog.csdn.net/wen20102321/article/details/53155736
Service是Android中的四大組件之一,它的級別和Activity差不多。只不過Service沒有頁面顯示,只能後台運行,可以和其他組件進行交互。
Service的後台運行並不是子線程,是在主線程中進行的,只是它沒有界面顯示。如果Service進行了耗時操作同樣需要開啟子線程,否則會跟Activity一樣出現ANR問題(application not response–程序沒有響應)。
補充說明:
主線程的內容包括UI和後台,只要程序中的UI或者後台其中一個在跑,程序都算是在運行狀態。
1,創建一個自己的TestService繼承Service
2,必須實現重寫其中的onBind方法,可以在里邊做各種操作,也可以接收傳遞過來的Intent的數據。
(在Android Studio中可以直接新建一個Service)
服務的注冊是四大組件中最簡單的一個,一般只要設置name屬性就可以了。
1,startService()啟動
(1)啟動服務startService:onCerate(),onStart()
(2)停止服務stopService:onDestroy()
此方法啟動服務,服務如果未被創建,系統會先調用onCreate()方法,接著調用onStrat()方法。如果調用startService前服務已經被啟動,多次調用啟動方法,不會多次調用onCreate,但會導致多次調用onStrat。
2,bindService()啟動
(1)綁定bindService:onCreate(),onBind()
(2)解除綁定unbindService:onUnbind()
(3)正常停止程序服務的方法是先接觸綁定unbindService,在停止服務stopService
綁定後調用stopService方法,這時候是不能停止服務的,如果這時再調用解綁unbindService,程序會先解綁,後停止服務。
用此方法啟動服務,在服務未被創建時,會先調用onCreate(),接著調用onBind()方法,這時候調用者和服務綁定在一起,調用者退出,系統會先調用服務的onUnbind(),然後onDestroy()。如果調用bindService之前服務已經被綁定,多次調用bindService並不會導致onCreate()和onBind()方法被多次調用。如果調用者想與正在綁定的服務解除綁定,可以調用unbindService()。
(1),onCerate()服務第一次被創建
(2),onStartComand()服務開始工作
(3),onBind()服務已經綁定
(4),onUnBind()服務解綁
(5),onDestroy()服務已經停止
普通的Service進行耗時操作要創建一個線程去完成,因為service是在主線程運行的,並且這個子線程完成工作要手動停止 。IntentService是繼承了Service並處理起步請求的一個類,在IntentService內有一個工作線程,來處理耗時操作,啟動IntentService的方式和啟動傳統的Service是一樣,當任務執行完成後,IntentService會自動停止,而不需要我們去控制。
可以啟動多次IntentService,每一個耗時操作會以工作隊列的方式在IntentService的onHandleIntent回調方法中執行,並且每次只會執行一個工作線程,執行完第一個再執行第二個,以此類推,而且,所有請求都在一個單線程中,不會阻塞主線程,同一時間只處理一個請求。
IntentService優點
1,省去了在Service中開線程的麻煩
2,當操作完成時,不用手動停止Service。IntentService是Service,但是比Service更智能。
Ⅲ android之服務的啟動服務和綁定服務的區別
1 通過startService
Service會經歷 onCreate --> onStart
stopService的時候直接onDestroy
如果是 調用者 直接退出而沒有調用stopService的話,Service會一直在後台運行。
下次調用者再起來仍然可以stopService。
2 通過bindService
Service只會運行onCreate, 這個時候 調用者和Service綁定在一起
調用者退出了,Srevice就會調用onUnbind-->onDestroyed
所謂綁定在一起就共存亡了。
Ⅳ 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中進行操作,將服務類型以前台的方式運行顯示在通知欄。
運行效果:
暫時引用吧,有空再實現一個:
參考資料:
Ⅳ Android 服務的限制
Google官網將Android服務分為了三種,前台服務,後台服務和綁定服務:
前台服務執行一些用戶能注意到的操作。例如,音頻應用會使用前台服務來播放音頻曲目。前台服務必須顯示 通知 。即使用戶停止與應用的交互,前台服務仍會繼續運行。
後台服務執行用戶不會直接注意到的操作。例如,如果應用使用某個服務來壓縮其存儲空間,則此服務通常是後台服務。
當應用組件通過調用 bindService() 綁定到服務時,服務即處於 綁定 狀態。綁定服務會提供客戶端-伺服器介面,以便組件與服務進行交互、發送請求、接收結果,甚至是利用進程間通信 (IPC) 跨進程執行這些操作。僅當與另一個應用組件綁定時,綁定服務才會運行。多個組件可同時綁定到該服務,但全部取消綁定後,該服務即會被銷毀。
我個人理解服務可以分為兩種, 前台 和 後台 ,而 綁定 應該是被當作一種狀態,因為 前台服務 和 後台服務 都可以進行綁定。
基於這個理解,我們將限制分成了前台和後台兩個部分:
從 Android 5.0(API 級別 21)開始,如果使用隱式 Intent 調用 bindService() ,則系統會拋出異常。為確保應用的安全性,在啟動 Service 時,請始終使用顯式 Intent,且不要為服務聲明 Intent 過濾器。
在後台中運行的 Service 會消耗設備資源,這可能會降低用戶體驗。 為了緩解這一問題,系統對這些 Service 施加了一些限制。
處於前台時,應用可以自由創建和運行前台與後台 Service。
Android 8.0 開始:系統不允許後台應用創建後台 Service。否則該函數將引發一個 IllegalStateException。
Android 8.0 開始:進入後台時,在一個持續數分鍾的時間窗內,應用仍可以創建和使用 Service。 在該時間窗結束後,應用將被視為處於 空閑 狀態。 此時,系統將停止應用的後台 Service,就像應用已經調用 Service 的 Service.stopSelf() 方法一樣。
為了解除這種限制,可以使用 JobScheler 作業替換後台 Service。
在 Android 8.0 之前,創建前台 Service 的方式通常是先創建一個後台 Service,然後將該 Service 推到前台。
而在Android 8.0 之後,系統不允許後台應用創建後台 Service。
解決方案:調用 startForegroundService() ,以在前台啟動新 Service。
在系統創建 Service 後,應用有五秒的時間來調用該 Service 的 startForeground() 方法以顯示新 Service 的用戶可見通知。 如果應用在此時間限制內 未 調用 startForeground() ,則系統將停止此 Service 並聲明此應用為 ANR 。
前台服務必須顯示優先順序為 PRIORITY_LOW 或更高的 狀態欄通知 ,這有助於確保用戶知道應用正在執行的任務。如果某操作不是特別重要,因而您希望使用最低優先順序通知,則可能不適合使用服務;相反,您可以考慮使用 計劃作業 。
在 Android 9 (API 28)之後,使用前台服務必須申請 FOREGROUND_SERVICE 許可權,否則會報 SecurityException 。 這是普通許可權,因此,系統會自動為請求許可權的應用授予此許可權。
每個運行服務的應用都會給系統帶來額外負擔,從而消耗系統資源。如果應用嘗試使用低優先順序通知隱藏其服務,則可能會降低用戶正在主動交互的應用的性能。因此,如果某個應用嘗試運行擁有最低優先順序通知的服務,則系統會在抽屜式通知欄的底部調用出該應用的行為。
以 Android 12 為目標平台的應用在後台運行時無法再啟動 前台服務 。
在 Android 11 及以後,系統對前台服務何時可以訪問設備的位置、攝像頭或麥克風進行了限制。
如果您的應用以 Android 11 或更高版本為目標平台,且在前台服務中訪問攝像頭或麥克風,則必須添加 前台服務類型 camera 和 microphone 。
如果你的應用 在後台運行時啟動了某項前台服務 :
如果某服務的功能(位置、麥克風 和 相機)受到了限制,則Logcat中會列印如下語句:
Ⅵ Android重學系列 Service 啟動和綁定原理
我們已經了解了BroadcastReceiver的原理,我們再來看看四大組件之一的Service是怎麼啟動的,以及怎麼運行的原理。
如果遇到什麼問題可以來到 https://www.jianshu.com/p/c4927c0b80a9 本文下進行交流
啟動Service的入口就是startService和bindService方法。我們先來看看startService在ContextImpl中做了什麼。
文件:/ frameworks / base / core / java / android / app / ContextImpl.java
此時調用的就是AMS的startService方法。
mServices是一個ActiveServices對象。這個對象是在AMS的構造函數中初始化好的。
這里調用了ActiveServices的startServiceLocked。
文件:/ frameworks / base / services / core / java / com / android / server / am / ActiveServices.java
核心流程有如下三個:
注意這里addToStarting是一個比較關鍵的判斷,addToStarting默認為false。
如果此時不是啟動前台服務,則需要進一步進行處理。如果ProcessRecord為空或者curProcState大於PROCESS_STATE_RECEIVER這個優先順序數值;也就是優先順序更小。
為了避免此時App應用是沒有任何的前台ui,或者App應用還沒有聲明。避免有的App通過startService進行應用的包活或者拉起應用。就會進行如下能夠存在的最大後台服務數量,則放入mDelayedStartList中進行延時啟動後台服務,現在直接返回了。
不然則說明能夠允許啟動後台服務, 就設置為addToStarting為true。
通過ComponentName也就是包名和類名查找ServiceRecord;通過Intent意圖過濾找到ServiceRecord。·
核心方法是bringUpServiceLocked。如果bringUpServiceLocked返回了異常,就返回一個特殊的ComponentName對象。
addToStarting為true,說明此時是一個能夠啟動的後台服務,則ServiceRecord添加到mStartingBackground中。如果mStartingBackground的數量為0,則直接調用ServiceMap的rescheleDelayedStartsLocked啟動後台服務。
這幾個關鍵的步驟,讓我們依次的考察,先來看看scheleCreateService中做了什麼。
如果第一次啟動就走第一個if的分支:
能看到和BroadcastReceiver的ANR思路一樣,通過一個延時的Handler,如果達到時間了還沒有移除這個Handler消息則報ANR異常。
這里根據啟動前台和後台分為兩種超時時間:
前台分別是10秒,後台服務不屬於後台進程組(判斷adj是否在SCHED_GROUP_BACKGROUND)是20秒,後台服務屬於後台進程組 200秒。
把數據封裝成CreateServiceData後,通過Handler調用如下方法:
透三點的核心原理可以看我寫的的Application創建和BroadcastReceiver原理兩篇文章。來看看Service中都做了什麼?
很簡單就是保存了傳遞過來的參數,值得注意的是這個IBinder對象其實就是指ServiceRecord對象。
接著執行Service.onCreate這個空實現的方法。
本質上還是調用了ActiveServices的serviceDoneExecutingLocked方法。
type是SERVICE_DONE_EXECUTING_ANON,所不會做更多的處理。 最後執行了serviceDoneExecutingLocked方法。
這個方法不斷的循環遍歷List<ServiceStartArgs>分發SERVICE_ARGS消息,這個消息通過主線程的Looper調用handleServiceArgs。
bindService在開發中用的不是很多,這里稍微提一下他的使用。
首先申明一個ServiceConnection對象,用於綁定服務端的Service。
調用bindService的方法綁定到某個Service中。當服務端的service成功回調onBind方法,我們只需要返回對應的Binder對象。就能使用調用bindService的客戶端在ServiceConnection的onServiceConnected的回調中獲得Binder對象。
之後就能通過這個Binder調用本進程或者其他進程的的方法了。實際上我們可以把這個過程看成一個多對多的服務-客戶端模型。多個客戶端通過Binder向多服務端Service通信,每一次我們都可以通過ComponentName判斷不同服務返回來的Binder對象。
這裡面很簡單,和BroadcastReceiver的思路很像。動態注冊的BroadcastReceiver會封裝成一個ReceiverDispatcher,而這里把ServiceConnection封裝成LoadedApk.ServiceDispatcher對象。
並且會把ServiceDispatcher作為value,ServiceConnection作為key緩存一個map中。並且以context為key,把這個臨時的map作為value緩存起來。這樣一個Context就映射有了多個ServiceDispatcher對象,也就可以注冊多個監聽被綁定Service狀態的監聽者了。
Ⅶ 安卓手機綁定獨立域名
手機更改或設置DNS伺服器的方法:第一步,手機下滑通知欄,在開關處,無線連接處長按進入無線列表。打開手機的設置,找到【WIFI】。
第二步,按住連接中的wifi網路幾秒就可以打開網路設置。第三步,選擇【修改網路】,可以更改網路IP、DNS。
第四步,在網路連接的詳細信息中,勾選【高級選項】。第五步,將IP設置為【靜態】。第六步,這時候就可以看見靜態IP設置,可以設置手機的DNS域名。
知識擴展:
手機,屬於移動終端,是可以握在手上的行動電話機。早期因為個頭較大有大哥大的俗稱,目前已發展至5G時代。1973年4月,美國工程技術員「馬丁·庫帕」發明世界上第一部推向民用的手機,「馬丁·庫帕」從此也被稱為現代「手機之父」。直至現在,手機成為人們生活中非常重要的工具,並像瑞士軍刀一般功能多樣化,並給人們帶來美好的生活體驗。
Android是一種基於Linux的自由及開放源代碼的操作系統。Android一詞的本義指「機器人」,同時也是Google於2007年11月5日宣布的基於Linux平台的開源手機操作系統的名稱,該平台由操作系統、中間件、用戶界面和應用軟體組成。Android的系統架構和其操作系統一樣,採用了分層的架構。從架構圖看,Android分為四個層,從高層到低層分別是應用程序層、應用程序框架層、系統運行庫層和Linux內核層。
Android在正式發行之前,最開始擁有兩個內部測試版本,並且以著名的機器人名稱來對其進行命名,它們分別是:阿童木(Android Beta),發條機器人(Android 1.0)。後來由於涉及到版權問題,谷歌將其命名規則變更為用甜點作為它們系統版本的代號的命名方法。甜點命名法開始於 Android 1.5 發布的時候。
作為每個版本代表的甜點的尺寸越變越大,然後按照26個字母數序:紙杯蛋糕(Android 1.5),甜甜圈(Android 1.6),松餅(Android 2.0/2.1),凍酸奶(Android 2.2),姜餅(Android 2.3),蜂巢(Android 3.0),冰激凌三明治(Android 4.0),果凍豆(Android4.1.X、Android 4.2.X和Android 4.3),奇巧(Android 4.4),棒棒糖(Android 5.0,Android 5.1.X)。
Android操作系統最初由Andy Rubin開發,主要支持手機。2005年由Google收購注資,並組建開放手機聯盟開發改良隨後,逐漸擴展到平板電腦及其他領域上,在不久的將來即將應用在微波爐,電冰箱等等電器上,發展前景很好。2008年10月第一部Android智能手機發布。2011年第一季度,Android在全球的市場份額首次超過塞班系統,躍居全球第一。 2012年11月數據顯示,Android占據全球智能手機操作系統市場76%的份額,中國市場佔有率為90%。安卓是目前最流行的手機智能平台,目前廣泛的應用在智能手機上,在智能手機領域掀起了「Android風暴」。
2. 手機作為伺服器通過域名訪問
方法/步驟分步閱讀
1
/3
登陸網站後台->設置->手機版->WAP設置->開啟Wap功能
設置手機網站網址:勾選自動跳轉,直接用手機訪問網站域名即可進入手機網站,也可以單獨解析綁定好一個二級域名用於手機網站域名。設置手機網站內容:手機網站內容跟電腦網站內容是同步的,勾選與電腦版一致,也可以自定義哪些欄目在手機網站展示,哪些欄目不展示。
2
/3
如何設置手機網站名稱和LOGO
網站後台->設置->手機版->WAP設置:手機網站的LOGO高度在46像素以內,寬度在200像素以內為佳。
3
/3
如何設置手機網站Banner
網站後台->外觀->手機->模板選擇中啟用手機模板->再到設置-首頁->大圖輪播設置:手機網站的Banner尺寸建議是500*500(像素)
3. 手機域名申請
是真的啊,去萬網等平台注冊都是沒問題的
4. 手機怎麼設置域名
、點擊手機【設置】選項,
2、在設置選項下選擇【無線區域網】並進入,
3、選擇需要連接的wifi無線熱點(以T-MAC為例),點擊藍色感嘆號,
4、進入「無線區域網」,可看到IP地址下有三個選項,分別為DHCP、Bootp、靜態;
5、輕觸「靜態」選項,然後在DNS項中輸入正確地址,一般DNS設置為當地服務商提供的地址,也可設置全球通用DNS地址8.8.8.8