Android 远程服务的启动和停止

3

我正在开发一款应用程序,该应用程序向服务器发出异步调用以获取通知。在主活动中,一切正常。现在困扰我的是,我需要一个服务,在应用程序不活动时轮询通知(就像GMail库存应用程序)。因此,我在主要活动的onStop函数中启动另一个进程中的远程服务,如下所示:

@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";
...

同时,在manifest 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>

但服务并没有停止,而是继续工作。当我关闭主活动时,另一个服务实例会生成并继续轮询。

我是否漏掉了什么? 或者这是一种不良使用远程服务的方式,甚至可以使用其他类型的服务/管理器来实现此目的?

感谢任何帮助!

编辑:

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


不,这并不是“粘性”的意思。我打算在找到阻止它在不同实例中出现的方法后再返回“粘性”。 - rock-ass
你确定它已经停止了吗? - njzk2
如果我在同一进程中启动它,当活动被销毁时,Android 会杀死该服务。而且它没有停止,这正是我想要做的。 - rock-ass
@RokasJurevicius:你是否尝试停止使用Intent?如果你正在使用任何线程或计时器来轮询服务器数据,则在Service中使用标志来停止/启动Thread/timer。 - ρяσѕρєя K
1
@RokasJurevicius:我是说在停止服务之前尝试停止所有计时器,并尝试停止您的服务Intent intent = new Intent();intent.setClass(getApplicationContext(), CloudAlarmsService.class); getApplicationContext().stopService(intent); - ρяσѕρєя K
显示剩余7条评论
1个回答

0
尝试停止 CloudAlarmsService 服务,方法如下:
Intent intent = new Intent();
intent.setClass(getApplicationContext(), CloudAlarmsService.class); 
getApplicationContext().stopService(intent);

我认为第一个版本更加简洁明了。第二个函数可能会在代码中带来一些混淆。 - rock-ass
@RokasJurevicius:是的,你说得对。但是当我们想要使用操作来启动/停止一个“Activity”、“Service”或任何其他应用程序组件时,我们将需要发送完全限定的意图。 - ρяσѕρєя K
如果您明确指定组件(在第一个示例中使用 CloudAlarmsService.class,在第二个示例中使用 setComponent()setClassName()),那么就不会发生 Intent 解析。您将绕过 Intent 解析过程(这是当您仅指定 ACTION 时发生的情况,与 OP 在调用 startService()stopService() 时所做的相同)。我想说的是,应该可以 不必 明确设置组件来停止服务。当然,我的想法也可能是错误的。 - David Wasser
1
关于使用 action来启动和停止... 的您的评论是不正确的。当 OP 启动服务时,他只是使用一些随机字符串作为 Intent ACTION ,没有其他操作。然后发生意图解析,Android 尝试找到一个适合的 Service 组件,该组件具有与此 ACTION 匹配的 IntentFilter。它找到了一个(即他的服务)并将其启动。Intent ACTION 字段不用于指定“开始”或“停止”,这个魔法是在框架本身中完成的。 - David Wasser
2
通常情况下,Intent解析无法正常工作是有可解释的原因的。我也看到过这些问题。如果您查看随SDK一起提供的Android示例代码中的/ApiDemos/src/com/example/android/apis/app/RemoteService.java文件,您可以看到他们展示了如何仅使用ACTION字符串(就像OP正在做的那样)启动和停止服务。 - David Wasser
显示剩余4条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接