Android远程服务启动和停止

问题描述:

我正在开发一个应用程序,用于通知异步调用服务器。在主要活动中一切正常。现在有什么困扰我,我需要一个服务,当应用程序不活动时(例如GMail股票应用程序),它会轮询通知。所以,我在另一个进程中的onStop功能类似,主要活动启动远程服务:Android远程服务启动和停止

@Override 
public void onStop() { 
    super.onStop(); 
    if(prefs.getBoolean(OPTIONS_KEY_SERVICE, false)) { 
     startServiceIntent = new Intent(CloudAlarmsService.MY_SERVICE); 
     Bundle b = new Bundle(); 
     b.putStringArray("duidCodes", duidCodes); 
     startServiceIntent.putExtras(b); 
     Log.d("SSE_SERVICE", "Starting Service"); 
     startService(startServiceIntent); 
    } 
} 

它正常工作,我得到通知的活动被关闭之后。现在我想在活动开始时停止远程服务(所以我不会同时有活动和服务轮询服务器)。我不喜欢这样写道:

@Override 
public void onResume() { 
    super.onResume(); 
    stopService(new Intent(CloudAlarmsService.MY_SERVICE)); 
    Log.d("SSE_SERVICE", "Stopping service"); 
} 

CloudAlarmsService.MY_SERVICE是我的服务类的字符串:

public class CloudAlarmsService extends Service { 
    public static String MY_SERVICE = "cloudindustries.alarms.service.BACKGROUND_SERVICE"; 
... 

而且它是在清单XML这样的声明:

<service android:process=":alarms_poller" android:name=".CloudAlarmsService"> 
    <intent-filter android:label="@string/serviceStopService"> 
      <action android:name="cloudindustries.alarms.service.BACKGROUND_SERVICE" /> 
    </intent-filter> 
</service> 

但服务不停止,并继续工作。在关闭主要活动之后,另一个服务实例会产生并继续轮询。

有什么我错过了吗? 或者,这可能对远程服务不利,甚至有另一种类型的服务/管理器可用于此目的?

感谢您的帮助!

编辑:

问题澄清:是否有可能停止从不同的活动(其中没有启动该服务)远程服务?

+0

什么呢onStartCommand回报? STICKY? (不知道你可以停止从一个不同的实例启动它的服务) – njzk2

+0

不是没有STICKY,我打算返回粘性时,我会找到一种方法来阻止它的不同实例。 –

+0

你确定它停止了吗? – njzk2

试图阻止CloudAlarmsService服务为:

Intent intent = new Intent(); 
intent.setClass(getApplicationContext(), CloudAlarmsService.class); 
getApplicationContext().stopService(intent); 
+0

我认为第一个版本更加简洁和简单。第二个函数可能会在代码中引起一些混淆.. –

+0

@RokasJurevicius:是的你说得对,但是当我们想要使用动作来启动/停止一个Activity,Serivce或其他应用程序组件时,我们需要发送完全限定的意图 –

+0

如果您明确指定组件(您在第一个示例中使用CloudAlarmsService.class进行操作),而在第二个示例中使用setComponent()和setClassName()指定该组件,那么会有**没有Intent解析**正在进行,你绕过了Intent解析过程(当你指定ACTION时会发生什么,因为OP在他对'startService()'和'stopService()')的原始调用中做了什么。试图得到的是它**应该有可能**停止服务**没有**明确设置组件。当然,我也可能是错误的。 –