<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之旅 廣告
                ### 二、Android中的多進程模式 #### 1、開啟多進程模式 正常情況下,Android中多進程是指一個應用中存在多個進程的情況。在Android中使用多進程只有一種方法:就是給四大組件(Activity、Service、Receiver、ContentProvider)在AndroidManifest中指定android:process屬性。這個屬性的值就是進程名。這意味著不能在運行時指定一個線程所在的進程。(其實還有一種方式,就是使用JNI在Native層去fork一個新的進程,這中方法屬于特殊情況,也不是常用的創建多進程的方式) 關于進程的詳細描述可參考[深入了解Android系統之進程](http://www.hmoore.net/alex_wsc/androidsystem/403689)和[Android進程和線程](http://www.hmoore.net/alex_wsc/android/431889) 可以在Eclipse的DDMS視圖中查看進程信息,還可以用shell來查看當前所存在的進程信息,命令為:adb shell ps 或者 adb shell ps|grep 包名。 ~~~ <activity android:name=".MainActivity" android:configChanges="orientation|screenSize" android:label="@string/app_name" android:launchMode="standard" > <intent-filter> <action android:name="android.intent.action.MAIN" /> </intent-filter> </activity> <activity android:name=".SecondActivity" android:configChanges="screenLayout" android:label="@string/app_name" android:process=":remote" /> <activity android:name=".ThirdActivity" android:configChanges="screenLayout" android:label="@string/app_name" android:process="com.ryg.chapter_2.remote" /> ~~~ 上面的代碼中, (1)MainActivity沒有指定process屬性,所以它運行在默認的進程中,默認進程的進程名是包名。 (2)SecondActivity會運行在一個單獨的進程中,進程名為“com.ryg.chapter_2:remote”,其中com.ryg.chapter_2是包名。在程序中的冒號“:”的含義是指要在當前的進程名前面附加上當前的包名,是一種簡寫的方法。而且以“:”開頭的進程屬于當前應用的私有進程,其他應用的組件不可以和它跑在同一個進程中。而進程名不以“:”開頭的進程屬于全局進程,其他應用通過ShareUID 方式可以和它跑在同一個進程中。 (3)ThirdActivity會運行在另一個單獨的進程中,進程名為“com.ryg.chapter_2.remote”。這是一種完整的命名方式。屬于全局進程,其他應用通過ShareUID方式可以和它跑在同一個進程中(需要這2個應用有相同的ShareUID且簽名相同才可以)。 >[info] **注意點一**:Android系統會為每一個應用分配一個唯一的UID,具有相同UID的應用才能共享數據。要求兩個應用具有相同的ShareUID并且簽名相同才可以跑在同一個進程中。在這種情況下,它們可以互相訪問對方的私有數據,比如data目錄、組件信息等,不管它們是否跑在同一個進程中。當然如果它們跑在同一個進程中,那么除了能共享data目錄、組件信息,還可以共享內存數據,或者說它們看起來就像是一個應用的兩個部分。 #### 2、多進程模式的運行機制 (1)多進程會帶來很多意想不到的麻煩,因為Android為每一個應用都分配了一個獨立的虛擬機,或者說為每個進程都分配了一個獨立的虛擬機,不同的虛擬機在內存分配上有不同的地址空間,這就導致在不同的虛擬機中訪問同一個類的對象會產生多份副本。這樣很就容易導致數據不同步。 (2)所有運行在不同進程的四大組件,只要它們之間需要通過內存來共享數據,都會共享失敗,這也是多進程所帶來的主要影響。正常情況下,四大組件中間不可能不通過一些中間層來共享數據,那么簡單的指定進程名來開啟多進程都會無法正確的運行。當然,特殊情況下,某些組件之間不需要共享數據,這個時候可以指定android:progress來開啟多進程,但是這種場景是不常見的,幾乎所有的情況都需要共享數據。 (3)使用多進程會造成主要以下四方面的問題: * 靜態成員和單例模式完全失效。(由獨立虛擬機造成) * 線程同步機制完全失效。(同上) * SharedPreferences的可靠性下降。(存在并發讀寫的問題) * Application會多次創建。(新的進程中又會導致進程所在的Application在新的虛擬機中再次創建) (4)運行在同一個進程中的組件是屬于同一個虛擬機和同一個Application的,同理,運行在不同進程的組件是屬于兩個不同的虛擬機和Application的。 (5)多進程相當于兩個不同的應用采用了SharedUID的模式 (6)實現跨進程的方式有很多: 1. Intent傳遞數據。 2. 共享文件和SharedPreferences。 3. 基于Binder的Messenger和AIDL。 4. Socket等
                  <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>

                              哎呀哎呀视频在线观看