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>
但服务不停止,并继续工作。在关闭主要活动之后,另一个服务实例会产生并继续轮询。
有什么我错过了吗? 或者,这可能对远程服务不利,甚至有另一种类型的服务/管理器可用于此目的?
感谢您的帮助!
编辑:
问题澄清:是否有可能停止从不同的活动(其中没有启动该服务)远程服务?
试图阻止CloudAlarmsService
服务为:
Intent intent = new Intent();
intent.setClass(getApplicationContext(), CloudAlarmsService.class);
getApplicationContext().stopService(intent);
我认为第一个版本更加简洁和简单。第二个函数可能会在代码中引起一些混淆.. –
@RokasJurevicius:是的你说得对,但是当我们想要使用动作来启动/停止一个Activity,Serivce或其他应用程序组件时,我们需要发送完全限定的意图 –
如果您明确指定组件(您在第一个示例中使用CloudAlarmsService.class进行操作),而在第二个示例中使用setComponent()和setClassName()指定该组件,那么会有**没有Intent解析**正在进行,你绕过了Intent解析过程(当你指定ACTION时会发生什么,因为OP在他对'startService()'和'stopService()')的原始调用中做了什么。试图得到的是它**应该有可能**停止服务**没有**明确设置组件。当然,我也可能是错误的。 –
什么呢onStartCommand回报? STICKY? (不知道你可以停止从一个不同的实例启动它的服务) – njzk2
不是没有STICKY,我打算返回粘性时,我会找到一种方法来阻止它的不同实例。 –
你确定它停止了吗? – njzk2