Servie學習總結

来源:http://www.cnblogs.com/Mihai/archive/2016/06/26/5617852.html
-Advertisement-
Play Games

一.什麼是Service Service是一個應用程式組件,它是安卓實現程式後臺運行的一個解決方案。 二.分類 服務有兩種類別started、bound.但是一個服務類所要繼承的類是一樣的,都是Service類。也就是說,一個服務,可以包含上面兩種運行方式的服務,只是與它重載的方法有關,如果重寫了o ...


一.什麼是Service

Service是一個應用程式組件,它是安卓實現程式後臺運行的一個解決方案。

二.分類

服務有兩種類別started、bound.但是一個服務類所要繼承的類是一樣的,都是Service類。也就是說,一個服務,可以包含上面兩種運行方式的服務,只是與它重載的方法有關,如果重寫了onStartCommand()即支持啟動服務,如果重寫onBiind()即支持綁定服務,所以如果同時重載實現這兩個方法即可實現兩種服務。

1.Started

如果一個應用程式組件(比如一個activity)通過調用startService()來啟動服務,則該服務就是被“started”了。一旦被啟動,服務就能在後臺一直運行下去,即使啟動它的組件已經被銷毀了。 通常,started的服務執行單一的操作並且不會向調用者返回結果。比如,它可以通過網路下載或上傳文件。當操作完成後,服務應該自行終止。image

2.Bound

如果一個應用程式組件通過調用bindService()綁定到服務上,則該服務就是被“bound”了。bound服務提供了一個客戶端/伺服器介面,允許組件與服務進行交互、發送請求、獲取結果,甚至可以利用進程間通信(IPC)跨進程執行這些操作。綁定服務的生存期和被綁定的應用程式組件一致。 多個組件可以同時與一個服務綁定,不過所有的組件解除綁定後,服務也就會被銷毀。 image

服務生命周期

根據前面的描述也可以知道,兩種服務的生命周期是不一樣的


image

三.幾個主要方法

1.OnStartCommand()

當其它組件,比如一個activity,通過調用startService()請求started方式的服務時,系統將會調用本方法。 一旦本方法執行,服務就被啟動,併在後臺一直運行下去。 如果你的代碼實現了本方法,你就有責任在完成工作後通過調用stopSelf()或stopService()終止服務。 (如果你只想提供bind方式,那就不需要實現本方法。)請註意onStartCommand()方法必須返回一個整數。這個整數是描述系統在殺死服務之後應該如何繼續運行(IntentService 實現代碼會替你處理這一點,當然那樣你就無法修改這個處理過程)。onStartCommand()的返回值必須是以下常量之一:STARTNOTSTICKY,STARTSTICKY,STARTREDELIVER_INTENT

2.OnBlind

當其它組件需要通過bindService()綁定服務時,系統會調用本方法。客戶端用它來和服務進行通信。 你必須確保實現本方法,不過假如你不需要提供綁定,那就返回null即可。

3.OnCreate()

4.OnDestory

5.終止服務

一個started服務必須自行管理生命周期。也就是說,系統不會終止或銷毀這類服務,除非必須恢復系統記憶體並且服務返回後一直維持運行。 因此,服務必須通過調用stopSelf()自行終止,或者其它組件可通過調用stopService()來終止它

四.IntentService

除了繼承Service,也可以繼承IntentService。因為大多數started服務都不需要同時處理多個請求(這實際上是一個危險的多線程情況),所以最佳方式也許就是用IntentService類來實現你的服務。註意:構造方法是必需的,必須用工作線程名稱作為參數。

使用情景:

我們或許會碰到這麼一種業務需求,一項任務分成幾個子任務,子任務按順序先後執行,子任務全部執行完後,這項任務才算成功。那麼,利用幾個子線程順序執行是可以達到這個目的的,但是每個線程必須去手動控制,而且得在一個子線程執行完後,再開啟另一個子線程。或者,全部放到一個線程中讓其順序執行。這樣都可以做到,但是,如果這是一個後臺任務,就得放到Service裡面,由於Service和Activity是同級的,所以,要執行耗時任務,就得在Service裡面開子線程來執行。那麼,有沒有一種簡單的方法來處理這個過程呢,答案就是IntentService。(具體可見:http://www.cnblogs.com/yydcdut/p/3960886.html)

五.相對於後臺,還有前臺服務

前臺服務是指那些經常會被用戶關註的服務,因此記憶體過低時它不會成為被殺的對象。 前臺服務必須提供一個狀態欄通知,並會置於“正在進行的”(“Ongoing”)組之下。這意味著只有在服務被終止或從前臺移除之後,此通知才能被解除。 要把你的服務請求為前臺運行,可以調用startForeground()方法。此方法有兩個參數:唯一標識通知的整數值、狀態欄通知Notification對象。
 

public class MyFrontService(){ ... @override public void onCreate(){ super.onCreate(); Notification notification = new Notification(R.drawable.icon,"通知來了"),System.currentTimeMillis());

Intent notificationIntent = new Intent(this, MainActivity.class);

PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, notificationIntent, 0);
//其中的參數id是一個唯一標識通知的整數,但是這裡註意這個整數一定不能為0
notification.setLatestEventInfo(this, "標題",
    “內容”, pendingIntent);

startForeground(ONGOING_NOTIFICATION, notification);
} } 

 

六.使用場景:服務還是線程

服務僅僅是一個組件,即使用戶不再與你的應用程式發生交互,它仍然能在後臺運行。因此,應該只在需要時才創建一個服務。

如果你需要在主線程之外執行一些工作,但僅當用戶與你的應用程式交互時才會用到,那你應該創建一個新的線程而不是創建服務。 比如,如果你需要播放一些音樂,但只是當你的activity在運行時才需要播放,你可以在onCreate()中創建一個線程,在onStart()中開始運行,然後在onStop()中終止運行。還可以考慮使用AsyncTask或HandlerThread來取代傳統的Thread類。關於線程的詳細信息,請參閱進程和線程。

請記住,如果你使用了服務,它預設就運行於應用程式的主線程中。因此,如果服務執行密集計算或者阻塞操作,你仍然應該在服務中創建一個新的線程來完成。

最後推薦一個很酷的線上作圖網站:https://www.processon.com/tour


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • “階段一”是指我第一次系統地學習Android開發。這主要是對我的學習過程作個記錄。 在上一篇階段一:解析JSON中提到,最近在寫一個很簡單的天氣預報應用。即使功能很簡單,但我還是想把它做成一個相對完整的應用。這樣的話,像以前想到什麼就做什麼,顯然是不行的,很容易就亂了。所以我就琢磨了一下,弄個什麼 ...
  • Android系統的開機動畫可分為三個部分,kernel啟動,init進程啟動,android系統服務啟動。這三個開機動畫都是在一個叫做 幀緩衝區(frame buffer)的硬體設備上進行渲染繪製的。http://hovertree.com/menu/android/ 在Linux內核中,每一個硬 ...
  • 如果是自己通過repo和git直接從google官網上download的源碼,請忽略這個問題,但是由於google在國內被限制登錄,通過這一種方法不是每個人都能download下來源碼,通常的做法就是從別人那拷貝,然後自己編譯,那麼通常會出現下麵的錯誤: No rule to make target ...
  • 1.統一界面管理 1.1利用一個activity去管理應用的所有的界面 1.1.1 理解Activity,Window和View之間的關係 1.1.2 避免Activity過多導致的問題, 例如:徹底退出應用,頻繁改動清單文件等 統一界面風格,降低用戶的學習成本 2.界面劃分 2.1展示效果圖,將界 ...
  • 當我們在使用tableview時,往往需要在cell左滑時顯示一個或是多個按鈕,但系統預設的只可顯示一個,如常見的刪除按鈕,那麼當我們的需求要求要有多個按鈕時又該怎麼辦呢,我們往下看。 首先,現看看系統的按鈕(只顯示一個按鈕時) //設置cell左滑後的刪除按鈕文字 -(NSString *)tab ...
  • //佈局相關<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" an ...
  • 這個項目是本人原創:要轉載,請說明下:http://www.cnblogs.com/blogwithstudyofwyn/p/5618107.html 項目的地址:https://github.com/Shangshanroushui/ShoppingCart.git 該程式是個一元奪寶的的購物車。 ...
  • ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...