2014-03-19 43 views
15

我想在一個單獨的進程中啓動一個服務(即,當我在設置中轉到我的應用程序管理器,然後轉到運行服務時,它應該在單獨的進程中顯示我的服務) 。在單獨的進程中啓動一個服務android

我的Android清單如下:

<application 
    android:allowBackup="true" 
    android:icon="@drawable/ic_launcher" 
    android:label="@string/app_name" 
    android:theme="@style/AppTheme" > 
    <activity 
     android:name="com.example.timerapp.MainActivity" 
     android:label="@string/app_name" > 
     <intent-filter> 
      <action android:name="android.intent.action.MAIN" /> 

      <category android:name="android.intent.category.LAUNCHER" /> 
     </intent-filter> 
    </activity> 

    <service android:name="com.example.timerapp.WorkerThread" 
     android:process="com.moizali"></service> 
</application> 

我開始在我的MainActivity的服務,所以很明顯,當我殺了服務關閉,以及應用程序。任何人都可以告訴我如何以不同的流程啓動服務。

+1

您可能會發現使用adb shell'ps'命令或DDMS進程列表測試結果會更精確,因爲設置菜單顯示似乎有一些奇怪的「用戶友好轉換」。 –

回答

19

檢查出屬性爲serviceAndroidManifest.xml。您需要將android:process的值更改爲以:開頭。

http://developer.android.com/guide/topics/manifest/service-element.html

相關部分:

如果分配給該屬性的名稱以冒號開始(「:」),一個新的進程,私有的應用程序,在需要時創建並在該過程中運行該服務。如果進程名稱以小寫字符開頭,則該服務將在該名稱的全局進程中運行,前提是它有權這樣做。這允許不同應用程序中的組件共享一個進程,從而減少資源使用。

提供的其他答案並不真正回答如何在單獨的過程中啓動服務的問題。


定義服務

android:process字段的過程定義了過程,其中服務是要運行的名稱。通常,應用程序的所有組件都在爲應用程序創建的默認進程中運行。但是,組件可以使用其自己的流程屬性覆蓋默認值,從而允許您將應用程序分佈到多個流程中。

如果分配給該屬性的名稱以冒號(':')開頭,則該服務將在其自己的單獨進程中運行。

<service 
    android:name="com.example.appName" 
    android:process=":externalProcess" /> 

如果進程名稱以小寫字母開頭,該服務將在該名字的全局進程中運行,只要它具有這樣的權限。這允許不同應用程序中的組件共享一個進程,從而減少資源使用。

+0

我嘗試使用此方法綁定到服務時出現錯誤。 – TheRealChx101

11

在單獨的進程上運行並不能解決您的問題。我有同樣的問題,這是一個正常的行爲。當你啓動一個服務(不是前臺服務)時,即使它在一個單獨的進程中,操作系統也可以隨時殺死它。就你而言,如果關閉活動/終止應用程序,操作系統通常會關閉該服務,即使它們處於單獨的進程中。您有兩種選擇:

1-以foreground service開始您的服務。在這種情況下,服務幾乎不會在任何情況下關閉。請注意,前臺服務專爲特定應用程序而設計,您將在通知中心和狀態欄中發出粘性通知。

2-將您的服務作爲開始服務(而非意向服務)。然後在服務的onStartCommand上,返回START_STICKY。這將告訴操作系統,如果出於任何原因需要關閉該服務,則在有足夠資源時再次運行該服務。在你的情況下,當用戶關閉活動/殺死應用程序時,服務進程將被終止,但通常會重新打開。

+0

如果我正在實施音樂播放器,該如何使用?我正在使用服務,但是當我開始使用startForeground()時打開一些沉重的應用程序時它已關閉() –

+0

將服務作爲前臺服務啓動。 (https://developer.android.com/guide/components/services.html#Foreground) – Amir

+0

謝謝。確實有效 –

相關問題