• <kbd id="qyk40"></kbd>
  • <strike id="qyk40"></strike><samp id="qyk40"><pre id="qyk40"></pre></samp>

    Service是Android中四大組件之一,在Android開發中起到非常重要的作用,先來看一下官方對Service的定義:

    Service is an application component that can perform long-running operations in the background and does not provide a user interface. Another application component can start a service and it will continue to run in the background even if the user switches to another application. Additionally, a component can bind to a service to interact with it and even perform interprocess communication (IPC). For example, a service might handle network transactions, play music, perform file I/O, or interact with a content provider, all from the background.

     

    翻 譯過來就是:Service(服務)是一個沒有用戶界面的在后臺運行執行耗時操作的應用組件。其他應用組件能夠啟動Service,并且當用戶切換到另外 的應用場景,Service將持續在后臺運行。另外,一個組件能夠綁定到一個service與之交互(IPC機制),例如,一個service可能會處理 網絡操作,播放音樂,操作文件I/O或者與內容提供者(content provider)交互,所有這些活動都是在后臺進行。

    Service有兩種狀態,“啟動的”和“綁定”

     

     

    • Started

    • A service is "started" when an application component (such as an activity) starts it by calling startService(). Once started, a service can run in the background indefinitely, even if the component that started it is destroyed. Usually, a started service performs a single operation and does not return a result to the caller. For example, it might download or upload a file over the network. When the operation is done, the service should stop itself.

    • Bound

    • A service is "bound" when an application component binds to it by calling bindService(). A bound service offers a client-server interface that allows components to interact with the service, send requests, get results, and even do so across processes with interprocess communication (IPC). A bound service runs only as long as another application component is bound to it. Multiple components can bind to the service at once, but when all of them unbind, the service is destroyed.

       

      通過 startService()啟動的服務處于“啟動的”狀態,一旦啟動,service就在后臺運行,即使啟動它的應用組件已經被銷毀了。通常 started狀態的service執行單任務并且不返回任何結果給啟動者。比如當下載或上傳一個文件,當這項操作完成時,service應該停止它本 身。

       

      還 有一種“綁定”狀態的service,通過調用bindService()來啟動,一個綁定的service提供一個允許組件與service交互的接 口,可以發送請求、獲取返回結果,還可以通過夸進程通信來交互(IPC)。綁定的service只有當應用組件綁定后才能運行,多個組件可以綁定一個 service,當調用unbind()方法時,這個service就會被銷毀了。

      另外,在官方的說明文檔中還有一個警告:

       

      Caution: A service runs in the main thread of its hosting process—the service does not create its own thread and does not run in a separate process (unless you specify otherwise). This means that, if your service is going to do any CPU intensive work or blocking operations (such as MP3 playback or networking), you should create a new thread within the service to do that work. By using a separate thread, you will reduce the risk of Application Not Responding (ANR) errors and the application's main thread can remain dedicated to user interaction with your activities.

       

      意 思是service與activity一樣都存在與當前進程的主線程中,所以,一些阻塞UI的操作,比如耗時操作不能放在service里進行,比如另外 開啟一個線程來處理諸如網絡請求的耗時操作。如果在service里進行一些耗CPU和耗時操作,可能會引發ANR警告,這時應用會彈出是強制關閉還是等 待的對話框。所以,對service的理解就是和activity平級的,只不過是看不見的,在后臺運行的一個組件,這也是為什么和activity同被 說為Android的基本組件。

      Service生命周期中的一些方法:

                              

       

      通 過這個圖可以看到,兩種啟動service的方式以及他們的生命周期,bind service的不同之處在于當綁定的組件銷毀后,對應的service也就被kill了。service的聲明周期相比與activity的簡單了許 多,只要好好理解兩種啟動service方式的異同就行。

       

      service生命周期也涉及一些回調方法,這些方法都不用調用父類方法,具體如下:

       

      [java] view plaincopy


      關于Service生命周期還有一張比較易懂的圖(來源于網絡)

       

      另外,這里要說明Service的一個子類,IntentService,首先看下官方文檔的說明:

       

      1. <span style="font-family:Comic Sans MS;font-size:18px;">public class ExampleService extends Service {  

      2.     int mStartMode;       // indicates how to behave if the service is killed  

      3.     IBinder mBinder;      // interface for clients that bind  

      4.     boolean mAllowRebind; // indicates whether onRebind should be used  

      5.   

      6.     @Override  

      7.     public void onCreate() {  

      8.         // The service is being created  

      9.     }  

      10.     @Override  

      11.     public int onStartCommand(Intent intent, int flags, int startId) {  

      12.         // The service is starting, due to a call to startService()  

      13.         return mStartMode;  

      14.     }  

      15.     @Override  

      16.     public IBinder onBind(Intent intent) {  

      17.         // A client is binding to the service with bindService()  

      18.         return mBinder;  

      19.     }  

      20.     @Override  

      21.     public boolean onUnbind(Intent intent) {  

      22.         // All clients have unbound with unbindService()  

      23.         return mAllowRebind;  

      24.     }  

      25.     @Override  

      26.     public void onRebind(Intent intent) {  

      27.         // A client is binding to the service with bindService(),  

      28.         // after onUnbind() has already been called  

      29.     }  

      30.     @Override  

      31.     public void onDestroy() {  

      32.         // The service is no longer used and is being destroyed  

      33.     }  

      34. }</span>  

    • IntentService

    • This is a subclass of Service that uses a worker thread to handle all start requests, one at a time. This is the best option if you don't require that your service handle multiple requests simultaneously. All you need to do is implement onHandleIntent(), which receives the intent for each start request so you can do the background work.

       

      IntentService 使用隊列的方式將請求的Intent加入隊列,然后開啟一個worker thread(線程)來處理隊列中的Intent,對于異步的startService請求,IntentService會處理完成一個之后再處理第二 個,每一個請求都會在一個單獨的worker thread中處理,不會阻塞應用程序的主線程,這里就給我們提供了一個思路,如果有耗時的操作與其在Service里面開啟新線程還不如使用 IntentService來處理耗時操作。而在一般的繼承Service里面如果要進行耗時操作就必須另開線程,但是使用IntentService就 可以直接在里面進行耗時操作,因為默認實現了一個worker thread。對于異步的startService請求,IntentService會處理完成一個之后再處理第二個。

       

      看下IntentService的具體實現:

       

       


      關于停止Service,如果service是非綁定的,最終當任務完成時,為了節省系統資源,一定要停止service,可以通過stopSelf() 來停止,也可以在其他組件中通過stopService()來停止,綁定的service可以通過onUnBind()來停止service。

      1. <span style="font-family:Comic Sans MS;font-size:18px;color:#222222;">public class HelloIntentService extends IntentService {  

      2.   

      3.   /** 

      4.    * A constructor is required, and must call the super IntentService(String)

      5.    * constructor with a name for the worker thread.

      6.    */  

      7.   public HelloIntentService() {  

      8.       super("HelloIntentService");  

      9.   }  

      10.   

      11.   /**

      12.    * The IntentService calls this method from the default worker thread with

      13.    * the intent that started the service. When this method returns, IntentService

      14.    * stops the service, as appropriate.

      15.    */  

      16.   @Override  

      17.   protected void onHandleIntent(Intent intent) {  

      18.       // Normally we would do some work here, like download a file.  

      19.       // For our sample, we just sleep for 5 seconds.  

      20.       long endTime = System.currentTimeMillis() + 5*1000;  

      21.       while (System.currentTimeMillis() < endTime) {  

      22.           synchronized (this) {  

      23.               try {  

      24.                   wait(endTime - System.currentTimeMillis());  

      25.               } catch (Exception e) {  

      26.               }  

      27.           }  

      28.       }  

      29.   }  

      30. }</span>  

     

    穩定

    產品高可用性高并發

    貼心

    項目群及時溝通

    專業

    產品經理1v1支持

    快速

    MVP模式小步快跑

    承諾

    我們選擇聲譽

    堅持

    10年專注高端品質開發
    • 返回頂部
    国产高清在线精品一区二区三区| 国产成人亚综合91精品首页| 久久无码专区国产精品| 国产精品玖玖美女张开腿让男人桶爽免费看| 国产成人精品999在线| 9999国产精品欧美久久久久久| 精品国产一区二区三区色欲| 久久精品中文字幕无码绿巨人| 亚洲Av永久无码精品三区在线 | 精品免费久久久久国产一区| 无码日韩AV一区二区三区| 免费观看国产精品| 国产精品伦理一二三区伦理| 国产成人精品高清在线观看96| 国产精品综合AV一区二区国产馆 | 国产精品美女一区二区三区 | 久久人人做人人玩人精品| 99re热这里只有精品18| 亚洲国产精品第一区二区| 亚洲AV无码国产精品麻豆天美 | 91久久精品91久久性色| 国产成人无码精品一区在线观看 | 亚洲精品国产福利在线观看| 久久久久久九九精品久小说| 热re99久久精品国产99热| 国产午夜福利精品一区二区三区| 中文国产成人精品久久亚洲精品AⅤ无码精品 | 香蕉精品高清在线观看视频| 亚洲国产日韩精品| 亚洲日韩国产AV无码无码精品| 精品日韩亚洲AV无码| 无码日韩人妻av一区免费| 日韩免费一级毛片| 午夜精品一区二区三区在线视| 精品一区二区三区无码免费直播| 日本精品夜色视频一区二区| 人妻精品久久久久中文字幕| d动漫精品专区久久| 国产精品丝袜久久久久久不卡| 精品国产AⅤ一区二区三区4区| 久久久久亚洲精品无码网址|