Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> Service(服務)

Service(服務)

編輯:關於Android編程

1. 什麼是服務: Android中的四大組件, 是一個可以長時間在後台運行的不提供用戶界面的一個類.   2.服務的特性: 服務一旦被啟動無論啟動它的界面還存不存在,服務都可以保持運行.服務可以被別的組件綁定,用於和綁定者進行交互或者可以實現IPC(進程間)通信   3.什麼時候需要在程序中添加服務: 當程序中有一些不需要用戶界面的功能,但是程序沒有界面打開的時候也可以實現這些功能,就需要在程序中添加服務. 如,執行和網絡相關的操作(如,下載), 音樂的播放, 文件的操作(上傳).   4.服務和線程的區別: 服務不是線程, 也不是用來執行耗時操作的(雖然可以把耗時操作放在服務中), 它是Android系統提供的用於把某些不需要的功能置於後台運行的容器.   5.服務的兩種使用方式: a, 啟動的方式使用服務 當應用程序的別的組件(Activity)通過調用startService方法啟動服務的時候, 這個服務就稱為啟動的服務. 啟動的服務的特性: 無論啟動者還存不存在, 服務都可以保持在後台長時間運行 啟動的服務的使用場景:如果服務所執行的是比較簡單一的操作, 並且這個操作是不需要給啟動者返回結果, 就可以采用啟動的方式使用服務 如單純執行一個下載或者是上傳的操作. 當啟動的服務把功能執行完之後,應該把服務銷毀掉.   b, 綁定的方式使用服務 當應用程序中的組件(Activity)通過調用bindService方法綁定服務的時候,這個服務就稱為綁定的服務 綁定服務的使用場景: 當綁定者需要服務有交互的時候, 就可以采用綁定的方式使用服務. (如, 把音樂的播放放在服務中實現, 程序中還需要通過界面控制音樂的播放, 暫停等, 這個時候界面就需要和服務有交互, 就應該采用綁定的方式使用服務.) 綁定的服務的特性:僅僅在綁定者存在的時候, 綁定的服務才會存在, 當綁定者被銷毀, 則綁定的服務也是會被銷毀. 一個服務可以同時被多個綁定者綁定, 只有所有的綁定者全部被銷毀, 服務才會被銷毀.   c, 同時采用啟動和綁定的方式使用: 首先先啟動然後再綁定 使用場景: 如果程序中需要和服務有交互, 同時當界面退出的時候依舊希望服務能在後台繼續保持運行, 則需要采用先啟動在綁定.   6, 服務的使用是通過Intent. 服務運行在程序的主線程中, 故不可以在服務中執行耗時操作, 否則會造成ANR.   7, 在程序中添加Service需要首先創建Service子類, 在子類中需要重寫一些方法: onStartCommand() 當采用startService方式創建服務對象的時候, 服務中的該方法就被調用, 該方法被調用的時候就表示服務已經啟動運行了. 該方法是定義服務功能的方法. 當采用bindService方法創建服務的時候, 該方法不會被調用 onBind() 僅僅在采用bindService方法創建服務的時候才會調用, 該方法的調用表示有綁定者要綁服務. 通過該方法給綁定者返回一個IBinder對象, 通過該對象實現綁定者和服務的交互. onCreate() 在采用綁定的方式以及啟動的方式使用服務的時候均會被調用, 該方法的調用表示服務對象被創建, 可以在該方法中實現對服務進行初始化的工作. 該方法僅僅在服務對象第一次被創建的時候調用[ 如果程序中的服務對象已經創建了, 再次創建該服務對象,則服務對象不會新建].   onDestroy() 采用啟動或者是綁定的方式使用服務, 當服務被銷毀該方法均會被調用, 該方法的調用就表示服務對象被銷毀, 就應該在該方法中釋放資源.   8, 采用啟動的方式使用服務 a, 創建Service子類, 重寫相關的生命周期方法 b, 在配置文件中注冊創建的Service子類 c, 在Activity中調用Intent指明啟動哪個服務 d, 在Activity 中調用 startService()方法按照啟動的方式創建出服務對象   //采用綁定的方式使用服務才會調用的方法 public IBinder onBind(Intent intent){} //當服務的對象被創建的時候, 該方法被調用 //該方法可以用於實現對服務的初始化 public void onCreate(){}   //采用啟動的方式使用服務的時候才會被調用 //該方法的調用表示服務已經啟動運行[定義服務的功能] public int onStartConmmand(Intent intent , int flags, int startld){}   //當服務對象被銷毀的時候被調用該方法 // 應該在該方法中實現對服務中所開辟的資源的釋放 public void onDestroy(){} // \ \ 9. 銷毀采用啟動方式創建的服務對象有兩種方式: a, 在啟動者中調用stopService方法 b,在Service中當Service把它的任務執行完之後在Service中調用stopService 列: Intent stopIntent =new Intent(this, MyService.class); stopService(stopIntent);//銷毀采用啟動   10. 采用啟動的方式創建Service的時候, Service的生命周期由3個方法構成: onCreate() 表示服務對象被創建 該方法僅在服務對象新建的時候才會調用 onStartCommand() 表示服務啟動運行 onDestroy() 表示服務對象被銷毀 服務第一次新建生命周期的調用: onCreate() --->onStartCommand() 服務對象已經創建過, 反復的啟動該服務, 聲明周期的調用: 反復的調用onStartCommand() 通過stop相關的方法停止一個服務, 生命周期的執行: 直接調用onDestory() //判斷在那個線程運行; Thread.currentThread().getName());   11. 服務運行於主線程中, 在服務中不能直接進行耗時操作.(如果需要在服務中執行耗時的操作,應該在服務中開辟子線程)   12. 借助於MediaPlayer理解Service的後台特性 用Activity播放音樂的特點: 當界面不退出音樂的播放和暫停都是正常. 如果在音樂播放的時候,退出了界面,當重新進入界面的時候音樂的播放和暫停都不在正常. 這種結果的原因: Activity是提供用於界面的前台組件,當退出界面的時候,當前的Activity就會被銷毀, 當再次進入的界面的時候, 又會重新創建一個新的Activity, 伴隨這個新的Activity的創建又會創建一個新的MediaPlayer, 在現在的界面在操作MediaPlayer的時候, 控制的就是第二個MediaPlayer對象. 如果無論界面有沒有打開音樂的播放都能夠進行, 同時界面打開關閉多少次, 再次打開的時候都能正常控制音樂的播放, 就需要通過服務實現 用Service播放音樂的可以實現後台播放, 界面再次打開依舊能夠控制音樂的播放的原因: 采用啟動的方式創建的Service在界面退出的時候不會被銷毀,所以音樂依舊能在後台播放,同時因為Service沒有被銷毀, 所以再次打開界面的時候,操作的還是同一個服務對象, 該服務對象的MediaPlayer還是之前的MediaPlayer, 所以在控制音樂的播放操作的還是同一個MediaPlayer對象.   13. 當Android系統內存不夠用的時候,系統會強制殺死一些服務對象以恢復系統資源[保留足夠的內存保證Android系統本身的正常運行].當一個服務是被Activity綁定的, 如果該Activity處於前台運行則該服務被銷毀的可能性比較小.如果一個服務僅僅是采用啟動的方式創建,在後台運行,則這個服務被在系統內存不夠的時候, 被系統殺死的可能性會比較高. 當一個服務因系統內存不夠用而被系統強制銷毀, 在系統的內存恢復的時候, 系統會重新的創建被它銷毀的服務對象,在系統重新創建被銷毀的服務對象的時候, 可以在程序中通過onStartCommand()方法的返回值告知系統如何重新創建被銷毀的服務對象. START_NOT_STICKY :(非粘性服務) 表示當前的服務對象因系統的內存不夠而被殺死, 當系統的內存重新恢復的時候, 之前被殺死的服務對象是不會重新啟動的. START_STICKY: (粘性服務--->不帶值) 表示當前的服務因為系統的內存不夠被系統意外殺死之後, 在系統的內存重新恢復的時候, 之前因系統內存不夠而被殺死的服務對象會被重新創建出來. 但是不會把最後一次啟動服務的時候的Intent重新傳入onStartCommand方法中. START_REDELIVER_INTENT: (粘性服務-->帶值) 表示當服務因為系統的內存不夠而被殺死, 在系統的內存恢復的時候, 會重新創建之前因內存不夠而被殺死的服務對象,同時會把之前最後一次啟動服務的時候創建的Intent對象傳入onStartCommand方法中.   14. IntentService 作用: 也是Service同樣滿足Service特性, 提供一個便捷的方式實現在Service中執行耗時的操作. 特點: 當服務的功能執行完畢之後, 該服務對象會自動銷毀.
  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved