<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ??碼云GVP開源項目 12k star Uniapp+ElementUI 功能強大 支持多語言、二開方便! 廣告
                Service有兩套流程,一套是啟動流程,另一套是綁定流程。我們做App開發的同學都應該知道。 ![](http://images2015.cnblogs.com/blog/13430/201705/13430-20170520231111588-262034472.png) #### **在新進程啟動Service** 我們先看Service啟動過程,假設要啟動的Service是在一個新的進程中,分為5個階段: * 1)App向AMS發送一個啟動Service的消息。 * 2)AMS檢查啟動Service的進程是否存在,如果不存在,先把Service信息存下來,然后創建一個新的進程。 * 3)新進程啟動后,通知AMS說我可以啦。 * 4)AMS把剛才保存的Service信息發送給新進程 * 5)新進程啟動Service 我們仔細看一下這5個階段: **第1階段** ![](http://images2015.cnblogs.com/blog/13430/201705/13430-20170520231119900-1492923568.png) 和Activity非常像,仍然是通過AMM/AMP把要啟動的Service信息發送給AMS。 **第2階段** AMS檢查Service是否在Manifest中聲明了,沒聲明會直接報錯。 AMS檢查啟動Service的進程是否存在,如果不存在,先把Service信息存下來,然后創建一個新的進程。 在AMS中,每個Service,都使用ServiceRecord對象來保存。 **第3階段** Service所在的新進程啟動的過程,就和前面介紹App啟動時的過程差不多。 新進程啟動后,也會創建新的ActivityThread,然后把ActivityThread對象通過AMP傳遞給AMS,告訴AMS,新進程啟動成功了。 **第4階段** AMS把傳進來的ActivityThread對象改造為ApplicationThreadProxy,也就是ATP,通過ATP,把要啟動的Service信息發送給新進程。 **第5階段** ![](http://images2015.cnblogs.com/blog/13430/201705/13430-20170520231131010-228401732.png) 新進程通過ApplicationThread接收到AMS的信息,和前面介紹的啟動Activity的最后一步相同,借助于ActivityThread和H,執行Service的onCreate方法。在此期間,為Service創建了Context上下文對象,并與Service相關聯。 需要重點關注的是ActivityThread的handleCreateService方法, ![](http://images2015.cnblogs.com/blog/13430/201705/13430-20170520231142197-538428403.png) 你會發現,這段代碼和前面介紹的handleLaunchActivity差不多,都是從PMS中取出包的信息packageInfo,這是一個LoadedApk對象,然后獲取它的classloader,反射出來一個類的對象,在這里反射的是Service。 四大組件的邏輯都是如此,所以我們要做插件化,可以在這里做文章,換成插件的classloader,加載插件中的四大組件。 至此,我們在一個新的進程中啟動了一個Service。 #### **啟動統一進程的Service** 如果是在當前進程啟動這個Service,那么上面的步驟就簡化為: 1)App向AMS發送一個啟動Service的消息。 2)AMS例行檢查,比如Service是否聲明了,把Service在AMS這邊注冊。AMS發現要啟動的Service就是App所在的Service,就通知App啟動這個Service。 3)App啟動Service。 我們看到,沒有了啟動新進程的過程。 #### **3)在同一進程綁定Service** 如果是在當前進程綁定這個Service呢?過程是這樣的: * 1)App向AMS發送一個綁定Service的消息。 * 2)AMS例行檢查,比如Service是否聲明了,把Service在AMS這邊注冊。AMS發現要啟動的Service就是App所在的Service,就先通知App啟動這個Service,然后再通知App,對Service進行綁定操作。 * 3)App收到AMS第1個消息,啟動Service, * 4)App收到AMS第2個消息,綁定Service,并把一個Binder對象傳給AMS * 5)AMS把接收到的Binder對象,發送給App * 6)App收到Binder對象,就可以使用了。 你也許會問,都在一個進程,App內部直接使用Binder對象不就好了,其實吧,要考慮不在一個進程的場景,代碼又不能寫兩份,兩套邏輯,所以就都放在一起了,即使在同一個進程,也要繞著AMS走一圈。 **第1階段:App向AMS發送一個綁定Service的消息**。 ![](http://images2015.cnblogs.com/blog/13430/201705/13430-20170520231153400-1053122975.png) **第4階段:處理第2個消息** ![](http://images2015.cnblogs.com/blog/13430/201705/13430-20170520231200791-687448931.png) **第5階段和第6階段**: 這一步是要仔細說的,因為AMS把Binder對象傳給App,這里沒用ATP和APT,而是用到了AIDL來實現,這個AIDL的名字是IServiceConnection。 ![](http://images2015.cnblogs.com/blog/13430/201705/13430-20170520231209541-1531293878.png) ServiceDispatcher的connect方法,最終會調用ServiceConneciont的onServiceConnected方法,這個方法我們就很熟悉了。App開發人員在這個方法中拿到connection,就可以做自己的事情了。 好了,關于Service的底層知識,我們就全都介紹完了。當你再去編寫一個Service時,是否感覺對這個組件理解的更透徹了呢? **附錄**: * 在新進程啟動服務的完整過程 ![](https://box.kancloud.cn/dbb2d43ea7503e752112d1699a9e00b1_5456x6248.jpg) * 在進程內綁定服務的完整過程 ![](https://box.kancloud.cn/4c93c6b2a0a9910401018387c18527de_7248x9348.jpg)
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看