天天看點

Android多程序

0x00 适用場景

1 單程序所配置設定的記憶體不夠,需要更多的記憶體。在早期android系統隻為一個單程序的應用配置設定了16M的可用記憶體,随着手機的硬體的提升和android系統的改進,雖然可配置設定記憶體越來越多,但仍舊可以通過開啟多程序來擷取更多的記憶體來處理自己App的業務

2 獨立運作的元件,比如音樂播放器,音樂的背景播放可以放到一個新的程序中,即使負責顯示UI的那個程序被回收,音樂也能正常在背景播放等等。

0x01 使用方法

在 activities、services、content providers和broadcast receivers中有一個屬性:

例如我們建立一個背景播放音樂的Service,并在新程序中運作:

<manifest ...>
  <application
    android:icon="@drawable/ic_launcher"
    android:label="@string/app_name"
    android:theme="@style/Theme.Main" >

    <activity
      android:name=".MusicActivity"
      />
    <service
      android:name=".MusicService"
      android:process=":music"
    />
  </application>
</manifest>
           

如果被設定的程序名是以“:”開頭的,則這個新的程序對于這個應用來說是私有的,當它被需要或者這個服務需要在新程序中運作的時候,這個新程序将會被建立。如果這個程序的名字前面沒有加‘’:“,而是以小寫字元開頭的,則這個服務将運作在一個以這個名字命名的全局的程序中,當然前提是它有相應的權限。這将允許在不同應用中的各種元件可以共享一個程序,進而減少資源的占用。

0x02 弊端

1 Application 會執行多次:

繼承Application的類會執行多遍, 現在很多的開發者都習慣在Application 的子類裡去做應用的初始化和資料存儲的操作,如果我們開啟多個程序而讓Application 的子類的各個回調方法都執行多次這顯然是不合理的,是以我們就應該區分程序,如果是應用的程序則做應用的操作,其他的程序(在這裡是一個服務)就做其他的操作。解決辦法可以是根據程序名稱執行不同的操作。

2 靜态成員和單例模式失效:

程序是被設計成獨立的(如安全特性),這意味着每一個程序将有自己的Dalvik VM執行個體, 配置設定了不同的位址空間,修改靜态成員隻會在自己的程序中有效,同樣單例模式也是隻有自己的程序中是單例,多個程序中就不能稱之為單例了,因為很可能多個程序都會存在這個所謂的單例。

3 SharedPreferences變得不可靠:

SharedPreferences并不支援并發的讀取,多個程序可能存在并發的情況,這樣SharedPreferences的讀和寫都變得不可靠。