2010-10-16 71 views
14

在我的Android應用程序中,我重載了Application類,並且更新了我的清單中的標記。此應用程序還創建一個Android服務。 我已經把我的應用程序類的onCreate一些日誌,我看到它被調用兩次。 第一次是當我的應用程序啓動(這是預期的),然後,它通常是在創建服務之後。 該日誌還顯示正在創建應用程序的第二個實例。 (我打印「這個」的價值,他們是不同的)。Android應用程序類被調用兩次

我認爲應用程序將被創建爲單例。 這是因爲我創建一個服務?

回答

1

問題是,服務也是一個組件,它有自己的生命週期,只是它沒有用戶界面。 您應該檢查developer application fundamental s的替代品。

+0

看來問題可能與我使用android:process標記在清單中聲明服務有關。它有道理嗎? – 2010-10-16 00:40:36

+0

是的。我剛剛檢查了同樣的信息來源,這也是我的理解。我沒有測試。 – 2010-10-16 00:46:25

+0

你的信息來源是什麼?我很想知道如何處理這種情況。有一個服務創建自己的進程並不罕見,而Application類應該是一個可以共享全局對象的「單例」。 – 2010-10-16 00:52:47

3

服務不應該真的被認爲是一個活動,如果你這樣想,你肯定會遇到問題。服務和活動可以屬於同一個應用程序,如果您在AndroidManifest.xml中以這種方式定義它們,但它們的行爲不同且具有不同的生命週期。如果您希望您的服務處於不同的過程中,則在<service>部分中設置android:process="string"以使其名稱與您的應用程序名稱不同。當它處於單獨的進程中時,您將無法訪問全局變量,並且您應該通過Intents與您的服務進行通信。如果你的服務更復雜,你可能想要通過AIDL來遠程調用它。如果您想要單身人士活動,則將該活動的launchMode設置爲singleInstancesingleTasksingleInstance表示它將成爲該Activity的第一個也是唯一的實例,並且不會爲任何新的Intents創建新的實例。由於它是該活動的唯一實例,因此它始終位於任務堆棧的頂部,並且始終處於處理針對此活動的新意圖的位置。如果活動聲明爲singleTask它也將是一個單身人士,但可能在同一個任務堆棧中有其他活動,甚至可能在其上的任務堆棧頂部有活動。這是一個重要的區別。請記住:單身人士任務堆棧頂部的不是的活動無法處理新的意圖,並且意圖將被丟棄。如果你想讓你的活動始終能夠處理所有注入它的新內容,那麼你很可能想要使用singleInstance

+0

不要將任務堆棧與屏幕上可見的內容混淆。我只是想在這裏說清楚。處於任務堆棧頂部並不意味着它在屏幕上可見。因此,一個單身Activity是其任務堆棧中唯一的Activity,可能在另一個任務後面的背景中(在另一個任務中)仍然能夠處理Intent(並且這樣做將會到達前臺) – 2010-10-16 04:19:18

26

是的,如果你使用的是android:process,那麼你有它運行在一個單獨的進程,所以當該服務將啓動一個新進程,因此需要創建該進程的新應用程序對象。

但是還有一個更基本的問題 - 一個Application對象啓動它的一個服務是不對的。重要的是,您不要將應用程序與其他操作系統中的「應用程序」相混淆。 Application對象不會驅動應用程序。在這個過程中,它只是應用程序的一個全局狀態。實際上,Application對象是完全多餘的 - 你的永遠不需要需要編寫一個Android應用程序。一般來說,我實際上建議人們不要使用它。它比其他任何事情都更容易造成麻煩。

另一種說法是:真正定義應用程序的是其活動,服務,接收者和提供者標籤的集合。那些是「推出」的。所有應用程序都是作爲初始化應用程序進程的一部分而創建的。它沒有自己的生命週期,它只是在那裏爲應用程序中的其他實際組件提供服務。

因此,在設計應用程序時忽略應用程序;它會減少混淆。 (取而代之,我更喜歡用這種狀態的全球單身人士。)

另外作爲一般規則,我建議不要使用android:process。這當然有一些用處,但絕大多數時候它不是必需的,只是使應用程序使用更多的RAM,效率更低,而且難以編寫(因爲在單個進程中無法利用全局變量) 。如果你到達一個真正有理由使用android:process的地方,應該很明顯。

+1

+1翔實。 – 2010-10-17 22:22:42

+0

+1,但是當每個進程需要初始化一次時,我想知道是否有比MyApplication.onCreate()更好的選項。例如,我還可以在哪裏可靠地註冊一個未捕獲異常的處理程序?當我有活動以及服務時,onCreate()會起作用。 – orip 2011-12-29 14:46:56