<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>

                ThinkChat2.0新版上線,更智能更精彩,支持會話、畫圖、視頻、閱讀、搜索等,送10W Token,即刻開啟你的AI之旅 廣告
                ## 9.1 四大組件的運行狀態 (1)四大組件中只有`BroadcastReceiver`既可以在AndroidManifest文件中注冊,也可以在代碼中注冊,其他三個組件都必須在AndroidManifest文件中注冊;`ContentProvider`的調用不需要借助Intent,其他三個組件都需要借助Intent。 (2)Activity是一種展示型組件,用于向用戶展示界面,可由顯式或者隱式Intent來啟動。 (3)Service是一種計算型組件,用于在后臺執行計算任務。盡管service是用于后臺執行計算的,但是它本身是運行在主線程中的,因此耗時的后臺計算仍然需要在單獨的線程中去完成。Service組件有兩種狀態:啟動狀態和綁定狀態。當service處于綁定狀態時,外界可以很方便的和service進行通信,而在啟動狀態中是不可與外界通信的。 (4)BroadcastReceiver是一種消息型組件,用于在不同的組件乃至不同的應用之間傳遞消息,它工作在系統內部。廣播有兩種注冊方式:靜態注冊和動態注冊。靜態注冊是在AndroidManifest中注冊,在應用安裝的時候會被系統解析,這種廣播不需要應用啟動就可以收到相應的廣播。動態注冊需要通過`Context.registerReceiver()`來注冊,這種廣播需要應用啟動才能注冊并接收廣播。BroadcastReceiver組件一般來說不需要停止,它也沒有停止的概念。 (5)ContentProvider是一種數據共享型組件,用于向其他組件乃至其他應用共享數據。ContentProvider中的`insert`、`delete`、`update`、`query`方法需要處理好線程同步,因為這幾個方法是在Binder線程池中被調用的,另外ContentProvider組件也不需要手動停止。 [下面對四大組件的工作過程的總結需要感謝[`amurocrash`童鞋的讀書筆記](http://blog.csdn.net/amurocrash/article/details/48858353)以及他細心制作的UML圖,幫助我從原書復雜的方法調用中跳出來看到整體的大致流程] ## 9.2 Activity的工作過程 (1)Activity啟動的大致流程 ![](https://box.kancloud.cn/2015-12-10_56692ec8304e7.png) (2)`ApplicationThread`是`ActivityThread`的一個內部類,它繼承自`ApplicationThreadNative`,而`ApplicationThreadNative`繼承自`Binder`并實現了`IApplicationThread`接口,`ApplicationThreadNative`的作用其實就和系統為AIDL文件生成的類是一樣的。 (3)`ActivityManagerService`(AMS)繼承自`ActivityManagerNative`,而`ActivityManagerNative`繼承自`Binder`并實現了`IActivityManager`這個Binder接口,因此AMS也是一個Binder。 (4)一個應用只有一個Application對象,它的創建也是通過`Instrumentation`來完成的,這個過程和Activity對象的創建過程一樣,都是通過類加載器來實現的。 (5)`ContextImpl`是Context的具體實現,ContextImpl是通過Activity的`attach`方法來和Activity建立關聯的,在`attach`方法中Activity還會完成Window的創建并建立自己和Window的關聯,*這樣當window接收到外部輸入事件后就可以將事件傳遞給Activity*。?[這里可能有誤,應該是Activity將事件傳遞給window] ## 9.3 Service的工作過程 (1)Service有兩種狀態:啟動狀態和綁定狀態,兩種狀態是可以共存的。 啟動過程: ![](https://box.kancloud.cn/2015-12-10_56692ec85a3ba.png) 綁定過程: ![](https://box.kancloud.cn/2015-12-10_56692ec889cf4.png) ## 9.4 BroadcastReceiver的工作過程 (1)BroadcastReceiver的工作過程包括廣播注冊過程、廣播發送和接收過程。 注冊過程:靜態注冊的時候是由`PackageManagerService`來完成整個注冊過程,下面是動態注冊的過程 ![](https://box.kancloud.cn/2015-12-10_56692ec8a71f6.png) 發送和接收過程: ![](https://box.kancloud.cn/2015-12-10_56692ec8a71f6.png) (2)廣播的發送有幾種類型:普通廣播、有序廣播和粘性廣播,有序廣播和粘性廣播與普通廣播相比具有不同的特性,但是發送和接收過程是類似的。 (3)一個應用處于停止狀態分為兩種情況:一是應用安裝后未運行;二是應用被手動或者其他應用強停了。從Android 3.1開始,處于停止狀態的應用無法接受到開機廣播。 ##9.5 ContentProvider的工作過程 (1)當ContentProvider所在的進程啟動的時候,它會同時被啟動并被發布到AMS中,這個時候它的onCreate要先去Application的onCreate執行。 (2)ContentProvider的啟動過程: 1.當一個應用啟動時,入口方法是`ActivityThread`的`main`方法,其中創建ActivityThread的實例并創建主線程的消息隊列; 2.`ActivityThread`的`attach`方法中會遠程調用`ActivityManagerService`的`attachApplication`,并將`ApplicationThread`提供給AMS,ApplicationThread主要用于ActivityThread和AMS之間的通信; 3.`ActivityManagerService`的`attachApplication`會調用`ApplicationThread`的`bindApplication`方法,這個方法會通過`H`切換到ActivityThread中去執行,即調用`handleBindApplication`方法; 4.`handleBindApplication`方法會創建Application對象并加載ContentProvider,注意是先加載ContentProvider,然后調用Application的`onCreate`方法。 (3)ContentProvider的`android:multiprocess`屬性決定它是否是單實例,默認值是false,也就是默認是單實例。當設置為true時,每個調用者的進程中都存在一個ContentProvider對象。 (4)當調用ContentProvider的`insert`、`delete`、`update`、`query`方法中的任何一個時,如果ContentProvider所在的進程沒有啟動的話,那么就會觸發ContentProvider的創建,并伴隨著ContentProvider所在進程的啟動。下圖是ContentProvider的query操作的大致過程: ![](https://box.kancloud.cn/2015-12-10_56692ec8cd215.png) 詳細的過程分析建議閱讀原書,簡直精彩! 其他學習資料 1.[Android開發藝術探索讀書筆記(三)](http://blog.csdn.net/amurocrash/article/details/48858353)
                  <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>

                              哎呀哎呀视频在线观看