Android多進程需要注意的一個地方,Android進程地方

來源:互聯網
上載者:User

Android多進程需要注意的一個地方,Android進程地方

  可能很多項目都會有一個自訂的Application,做一些初始化操作以及全域化的一些資料儲存,這時如果程式中定義了遠程服務(android:process=":remote"),Application就會被執行個體化多次,每個進程執行個體化一次,所以Application中onCreate也會被執行多次,這肯定是沒必要的,特別是Application bind一個Service的情況。

  因為Application是應用程式的入口,也不能定義多個,在AndroidMainfest.xml中定義多個ide都會直接報錯。如果確實需要自訂Application,可以在自訂的Application中通過進程名來區分是哪個進程,然後進行相應的邏輯處理。

  擷取進程名的方法:

   @Nullable    public static String getProcessName(Context context, int pid){        ActivityManager am = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);        List<ActivityManager.RunningAppProcessInfo> runningApps = am.getRunningAppProcesses();        if (runningApps != null && !runningApps.isEmpty()) {            for (ActivityManager.RunningAppProcessInfo procInfo : runningApps) {                if (procInfo.pid == pid) {                    return procInfo.processName;                }            }        }        return null;    }

 

 

另外整理了一些Application以及進程相關的知識:

1、Application、Task、Activity之間的關係:

 

這個就沒必要做文字說明了,很清晰的一個關係圖。

 

2、進程優先順序(5級):

2.1.前台進程 Foreground process

  前台進程是使用者當前做的事所必須的進程,如果滿足下面各種情況中的一種,一個進程被認為是在前台:

  1.進程持有一個正在與使用者互動的Activity(Activity正處於onResume()的狀態)。

  2.進程持有一個Service,這個Service和使用者正在互動的Activity綁定。

  3.進程持有一個Service,這個Service是在前台啟動並執行,即它調用了 startForeground()

  4.進程持有一個Service,這個Service正在執行它的生命週期回呼函數(onCreate()onStart(), or onDestroy())。

  5.進程持有一個BroadcastReceiver,這個BroadcastReceiver正在執行它的 onReceive() 方法。

  殺死前台進程需要使用者互動,因為前台進程的優先順序是最高的。

 

2.2.可見進程 Visible process

  如果一個進程不含有任何前台的組件,但是仍然影響著使用者在螢幕上可以看到的內容,就是可見進程。

  可見進程滿足下列情況之一:

  1.進程持有一個Activity,這個Activity不在前台,但是仍然被使用者可見(處於onPause()調用後又沒有調用onStop()的狀態)。

  這種情況發生在,比如,前台的activity開啟了一個對話方塊,這樣activity就會在其後可見。

  2.進程持有一個Service,這個Service和一個可見的(或者前台的)Activity綁定。

  可見的進程也被認為是很重要的,一般不會被銷毀,除非是為了保證所有前台進程的運行而不得不殺死可見進程的時候。

 

2.3.服務進程 Service process

  如果一個進程中運行著一個service,這個service是通過 startService() 開啟的,並且不屬於上面兩種較高優先順序的情況,這個進程就是一個服務進程。

  儘管服務進程沒有和使用者可以看到的東西綁定,但是它們一般在做的事情是使用者關心的,比如後台播放音樂,後台下載資料等。

 

2.4.後台進程 Background process

  如果進程不屬於上面三種情況,但是進程持有一個使用者不可見的activity(activity的onStop()被調用,但是onDestroy()沒有調用的狀態),就認為進程是一個後台進程。

  後台進程不直接影響使用者體驗,系統會為了前台進程、可見進程、服務進程而任意殺死後台進程。

  通常會有很多個後台進程存在,它們會被儲存在一個LRU (least recently used)列表中,這樣就可以確保使用者最近使用的activity最後被銷毀,即最先銷毀時間最遠的activity。

 

2.5.空進程

  如果一個進程不包含任何活躍的應用組件,則認為是空進程。

  儲存這種進程的唯一理由是為了緩衝的需要,為了加快下次要啟動這個進程中的組件時的啟動時間。

  系統為了平衡進程緩衝和底層核心緩衝的資源,經常會殺死空進程。

 

2.6  相關說明

  1.Android會儘可能地把進程放在高的優先順序。

  比如,一個進程擁有一個可見狀態的activity和一個service,這個進程會被認為是可見進程,而不是服務進程。

  2.一個進程的等級有可能會因為其他進程的依賴而提高,一個進程服務於另一個進程,則它的優先順序不會比它服務的進程優先順序低。

  比如,A進程中的一個content provider向B進程中的一個客戶提供服務,或A進程中的一個service被綁定在B進程中的一個組件上,則A進程的優先順序至少和B進程的優先順序一樣高。

  3.因為服務進程的優先順序比後台進程的優先順序高,所以對於一個需要啟動一個長時間操作的activity來說,開啟一個service比建立一個背景工作執行緒的方法更好,尤其是對於操作將很可能超出activity的期間時。

  比如要上傳一個圖片檔案,應該開啟一個service來進行上傳工作,這樣在使用者離開activity時工作仍在進行。使用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.