[譯]Android應用程式基底礎 >> 進程和線程(Processes and Threads)

來源:互聯網
上載者:User

    當一個應用程式的第一個組件需要被運行時,android系統會啟動一個只有一個主線程的linux進程來運行這個組件。預設情況下,應用程式的所有組件都是運行在這個主線程中的。

    但是你也可以使組件運行在其它的進程中,而且你也可以從任何進程中新開起子線程。

進程
    在manifest檔案中的<activity>,<service>,<receiver>和<provider>標籤都有一個名為process的屬性,通過設定這個屬性,我們可以控制這個組件運行在哪個進程中。我們可以讓這個應用程式中的所有組件運行在各自不同的進程中,或者讓它們中的一部分運行在同一個進程中,當然我們也可以指定不同程式的組件運行在同一個進程中――需要不同的應用程式共用相同的使用者id和用相同的認證進行簽名。<application>標籤也有一個名為process的屬性,它是用於設定本應用程式中所有組件預設啟動並執行進程。
    所有的組件都是運行在進程的主線程中,所以報告使用者動作事件――比如View.onKeyDown()方法――都是運行在進程的主線程中的。這意味著組件不應該執行耗時操作(比如網路操作和大迴圈計算),因為這樣會阻塞線程。你可以新開啟一個子線程來做這種耗時的工作。

    在某些時候,android系統會終止某個進程,比如當系統需要向使用者提供更重要的服務,而系統的可用記憶體又比較少的情況。在這種情形下,運行在那個進程中的所有組件也會被清理掉。
    在選擇終止哪一個進程的時候,android會對評估進程對於使用者的重要性。比如一個運行有可見的activity組件的進程的重要性就要比一個沒有運行可見的activity組件的進程的重要性要高。進程的重要性取決於運行在這個進程中的組件的狀態。

線程
    雖然在預設情況下,應用程式的就運行在一個進程中,但你可以在需要的時候,新開啟線程來完成耗時的後台工作。
    和j2se中的一樣,線程是用java.lang.Thread類型來表示的。Android中提供了一些用於管理線程的便利類――android.os.Looper類用於線上程中運行一個訊息迴圈,android.os.Handler類用於處理訊息,android.os.HandlerThread類用於建立一個具有訊息迴圈的線程。

遠端程序呼叫
    Android系統有一個用於遠端程序呼叫(RPCs)的輕量級機制――即一個方法在本地被調用,但是在遠程(另一個進程)被執行,執行完成後產生的結果返回給調用者。這就需要將方法調用和調用的資料分解到一個作業系統可以理解的程度,然後將其從本地進程地址空間傳輸到遠程進程地址空間,並且在遠程重新裝配並執行。執行產生的結果則進行反方向的傳輸。Android已經實現了底層的機制,所以開發人員只需要集中精力於實現RPC介面即可。

    一個RPC介面只可以有方法。預設情況下,所有的方法以同步模式執行(即在遠程方法執行完成之前,無論是否有傳回值,本地調用者都是處於阻塞狀態)
    簡明地說,RPC以下面的流程來工作的:你需要聲明一個RPC介面,此介面用於你後面用一個單獨的IDL(介面定義語言)去實現。aidl工具會依據這個介面的聲明來產生一個java語言版的介面聲明,這個java介面聲明對本地進程和遠程進程都必須是可用的。它包含了兩個內部類,如所示:

    內部類已經有了用於管理你聲明的RPC介面的遠端程序呼叫的必需代碼。兩個內部類都實現了android.os.IBinder介面。其中一個內部類被作業系統內部在本地使用,所以你可以忽略它;另一個內部類,名字叫Stub,是從android.os.Binder類繼承下來的,這裡面除了用於執行IPC調用的內部代碼之外,還包含了你在RPC介面中聲明的介面方法,你應該繼承這個Stub類來實現這在RPC介面中聲明的方法,如所示。

    通常情況下,遠程進程是被一個service組件控制的(因為service組件可以告知系統這個進程以及串連到其它進程的串連)。
    Typically, the remote process would be managed by a service (because a service can inform the system about the process and its connections to other processes). It would have both the interface file generated by the aidl tool and the Stub subclass implementing the RPC methods. Clients of the service would have only the interface file generated by the aidl tool.

一個service組件和其用戶端建立串連的流程如下:

    Service組件的用戶端(本地)需要實現android.content.ServiceConnection.onServiceConnected()和android.content.ServiceConnection.onServiceDisconnected()方法,用以在成功串連到(和斷開)遠端service組件時候擷取通知。通過調用bindService()方法來建立串連。

    重載Service組件的onBind()方法,並通過傳遞給onBind()方法的intent對象來決定接受或拒絕串連。若接受串連,則返回Stub子類的對象。一旦此Service組件接受了串連,Android系統就會在本地回調onServiceConnected()方法,並且將IBinder對象傳入,service組件管理了一個此Stub子類的代理。本地的用戶端可以通過這個代理來作用於遠程端的service組件。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.