2010-12-17 166 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

相关问题