2010-12-17 275 views
11

我對Android還是很新鮮,我認爲下面的配置適用於在應用啓動時啓動我的服務。如何在應用程序啓動時啓動Android服務?

<service android:name=".PlaylistUpdaterService"> 
     <intent-filter> 
      <action android:name="android.intent.action.MAIN" /> 
      <category android:name="android.intent.category.LAUNCHER" /> 
     </intent-filter> 
    </service> 

但事實並非如此。我錯過了什麼?

回答

8

糾正我,如果我錯了,但android.intent.category.LAUNCHER只適用於活動。所以,看起來不像啓動Service的有效方式。如果你做以下就可以達到相同的:

  • 創建將只用於啓動服務
  • 該活動的透明的活動,你並不需要指定的GUI佈局。所以,你不需要在activity的onCreate()中設置ContentView()。你唯一需要的是把

@android:風格/ Theme.NoDisplay

下的主題標籤該活動在AndroidManifest.xml中。

  • 開始服務從您的活動的onCreate()
  • 致電finish()onStart()您的活動將其關閉。

因此,您的活動對用戶來說是不可見的,很快就沒有人會注意到它用於啓動服務。

+0

這種方法在活動正在運行時鎖定UI,但由於它被設置爲半透明,所以無法做任何事情。是否有辦法避免此UI鎖定 – 2013-01-10 22:56:43

+0

@ Noble6 - 更新我的答案以使其更清晰。感謝寶貴意見。 – Zelimir 2013-01-11 08:43:28

+3

無需使用某個活動,這隻會減慢應用程序的啓動時間,因爲啓動和停止活動的開銷。重寫應用程序的下面的方法更好。但是,如果您真的想從活動開始,那麼最好有一個基本活動,如果該服務尚未啓動,然後讓所有活動都擴展該基本活動,則該服務將作爲默認行爲啓動。 – 2015-07-07 21:34:54

19

錯!擴展Application類(IE自己製作),然後在onCreate()方法中做到這一點。

//Service is below 
Intent serviceIntent = new Intent(getApplicationContext(), PlaylistUpdaterService.class); 
startService(serviceIntent); 

並將該意圖過濾器從清單文件中的聲明中取出。把它作爲

<service android:name=".PlaylistUpdaterService"> 

的意圖過濾器需要完成以下任務在你家活動僅

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

你這樣做是因爲Application類是儘快啓動的應用程序的原因,和充當android框架管理的全局類。

實際上,如果您希望每次返回主屏幕時都運行該服務,則應在家庭課程onResume()中啓動該服務。將它放入應用程序onCreate()只會在用戶第一次啓動時或運行進程被終止後才啓動服務。或者你可以把它放在你的家庭班onCreate(),但這甚至不保證每次都運行。

+0

你說錯了,但你也爲我的活動設置了intent過濾器category.LAUNCHER。除此之外,你的方法也是正確的。 – Zelimir 2013-01-11 22:37:32

+0

如果您希望僅啓動一次服務(啓動時),則這不是合適的方法。每次用戶改變方向時服務都會啓動。我也在尋找解決方案。 – DerpyNerd 2013-10-31 20:52:45

+3

@RobbieVercammen - 如果服務正在運行,則第二次啓動將不會執行任何操作。這是默認行爲。 – 2015-07-07 21:31:57

相關問題