亚洲乱码卡一卡二卡三永久-亚洲乱码一二三四区-亚洲乱码一区二区三区在线观看-亚洲伦理一区-成人在色线视频在线观看免费大全-成人在线91

Service是Android中四大組件之一,在Android開發(fā)中起到非常重要的作用,先來看一下官方對(duì)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(服務(wù))是一個(gè)沒有用戶界面的在后臺(tái)運(yùn)行執(zhí)行耗時(shí)操作的應(yīng)用組件。其他應(yīng)用組件能夠啟動(dòng)Service,并且當(dāng)用戶切換到另外 的應(yīng)用場(chǎng)景,Service將持續(xù)在后臺(tái)運(yùn)行。另外,一個(gè)組件能夠綁定到一個(gè)service與之交互(IPC機(jī)制),例如,一個(gè)service可能會(huì)處理 網(wǎng)絡(luò)操作,播放音樂,操作文件I/O或者與內(nèi)容提供者(content provider)交互,所有這些活動(dòng)都是在后臺(tái)進(jìn)行。

Service有兩種狀態(tài),“啟動(dòng)的”和“綁定”

 

 

  • 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()啟動(dòng)的服務(wù)處于“啟動(dòng)的”狀態(tài),一旦啟動(dòng),service就在后臺(tái)運(yùn)行,即使啟動(dòng)它的應(yīng)用組件已經(jīng)被銷毀了。通常 started狀態(tài)的service執(zhí)行單任務(wù)并且不返回任何結(jié)果給啟動(dòng)者。比如當(dāng)下載或上傳一個(gè)文件,當(dāng)這項(xiàng)操作完成時(shí),service應(yīng)該停止它本 身。

     

    還 有一種“綁定”狀態(tài)的service,通過調(diào)用bindService()來啟動(dòng),一個(gè)綁定的service提供一個(gè)允許組件與service交互的接 口,可以發(fā)送請(qǐng)求、獲取返回結(jié)果,還可以通過夸進(jìn)程通信來交互(IPC)。綁定的service只有當(dāng)應(yīng)用組件綁定后才能運(yùn)行,多個(gè)組件可以綁定一個(gè) service,當(dāng)調(diào)用unbind()方法時(shí),這個(gè)service就會(huì)被銷毀了。

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

     

    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一樣都存在與當(dāng)前進(jìn)程的主線程中,所以,一些阻塞UI的操作,比如耗時(shí)操作不能放在service里進(jìn)行,比如另外 開啟一個(gè)線程來處理諸如網(wǎng)絡(luò)請(qǐng)求的耗時(shí)操作。如果在service里進(jìn)行一些耗CPU和耗時(shí)操作,可能會(huì)引發(fā)ANR警告,這時(shí)應(yīng)用會(huì)彈出是強(qiáng)制關(guān)閉還是等 待的對(duì)話框。所以,對(duì)service的理解就是和activity平級(jí)的,只不過是看不見的,在后臺(tái)運(yùn)行的一個(gè)組件,這也是為什么和activity同被 說為Android的基本組件。

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

                            

     

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

     

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

     

    [java] view plaincopy


    關(guān)于Service生命周期還有一張比較易懂的圖(來源于網(wǎng)絡(luò))

     

    另外,這里要說明Service的一個(gè)子類,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 使用隊(duì)列的方式將請(qǐng)求的Intent加入隊(duì)列,然后開啟一個(gè)worker thread(線程)來處理隊(duì)列中的Intent,對(duì)于異步的startService請(qǐng)求,IntentService會(huì)處理完成一個(gè)之后再處理第二 個(gè),每一個(gè)請(qǐng)求都會(huì)在一個(gè)單獨(dú)的worker thread中處理,不會(huì)阻塞應(yīng)用程序的主線程,這里就給我們提供了一個(gè)思路,如果有耗時(shí)的操作與其在Service里面開啟新線程還不如使用 IntentService來處理耗時(shí)操作。而在一般的繼承Service里面如果要進(jìn)行耗時(shí)操作就必須另開線程,但是使用IntentService就 可以直接在里面進(jìn)行耗時(shí)操作,因?yàn)槟J(rèn)實(shí)現(xiàn)了一個(gè)worker thread。對(duì)于異步的startService請(qǐng)求,IntentService會(huì)處理完成一個(gè)之后再處理第二個(gè)。

     

    看下IntentService的具體實(shí)現(xiàn):

     

     


    關(guān)于停止Service,如果service是非綁定的,最終當(dāng)任務(wù)完成時(shí),為了節(jié)省系統(tǒng)資源,一定要停止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>  

 

穩(wěn)定

產(chǎn)品高可用性高并發(fā)

貼心

項(xiàng)目群及時(shí)溝通

專業(yè)

產(chǎn)品經(jīng)理1v1支持

快速

MVP模式小步快跑

承諾

我們選擇聲譽(yù)

堅(jiān)持

10年專注高端品質(zhì)開發(fā)
  • 返回頂部
主站蜘蛛池模板: 日韩欧美一区二区中文字幕 | 关婷哪一级毛片高清免费看 | 国产97视频在线 | 永久免费看黄 | 国产中日韩一区二区三区 | 亚洲国产成+人+综合 | 亚州激情视频 | 一级片按摩 | 曰批女人视频在线观看 | 国产成人a一在线观看 | 成年网址网站在线观看 | 性 色 黄 一级 | 黄色aqq| 一级做a免费观看大全 | 日韩成人毛片高清视频免费看 | 色黄污在线看黄污免费看黄污 | 在线午夜视频 | 国产成人免费全部网站 | 中文字幕日韩精品亚洲七区 | 最近2019中文免费字幕 | 日本成人激情视频 | 成人免费动作大片黄在线 | 黄a免费| 一区二区三区四区精品视频 | 成人激情开心网 | 国产 日韩 一区 | 五月天婷婷视频 | 黄色大片网 | 在线视频观看免费视频18 | 欧美成人怡红院在线观看 | 欧美人在线一区二区三区 | 成人网18免费软件 | 成人在线色视频 | 免费看一级黄色 | 麻豆国产精品有码在线观看 | 成人国产一区二区 | 亚洲伊人色一综合网 | 欧美特级视频 | 国产国产精品人在线视 | 免费a级人成a大片在线观看 | 天天天天做夜夜夜做 |