通过调用startService将消息发送到服务

时间:2012-10-09 10:06:38

标签: android android-service

我创建了一项服务,我正在使用bindService函数通过我的活动访问它,但我想在我的活动退出后继续运行我的服务。

为此,我要使用startService,但之前我使用的是bindService ServiceConnection,我正在向handler发送消息(在服务中) )一旦onServiceConnected被调用。

但我不知道如何使用startService发送消息,因为我没有像onServiceConnected这样的地方将消息发送给处理程序。

注意:我想继续运行我的服务,因为我正在从我的服务中更新小部件。

所以服务有两个角色

  1. 更新活动内的textview
  2. 一旦活动退出,服务将更新小部件

2 个答案:

答案 0 :(得分:4)

您可以选择与服务进行通信:

  • 将额外的内容添加到intent并调用startService。你可以打电话给它 多次,即使服务已在运行
  • 创建Messenger并使用它与服务进行通信
  • 使用bindService

请确保在您的服务中使用START_STICKY,以便在活动结束后继续运行,并startForeground()显示通知,否则您的服务将在一段时间后被SO杀死(平均而言,30几分钟到一小时)。

开始流程

  • ClientActivity(CA)启动服务并将CA Messenger地址作为意图的额外内容发送给服务。
  • 在服务启动时,它将服务Messenger地址发送回 CA(使用CA Messenger地址发送消息)。
  • 最后,服务返回START_STICKY。

有了这两个,客户端和服务器将知道彼此的Messenger地址,并且不需要绑定。

停止服务:

要停止服务,请使用您的活动中的以下内容:

stopService(new Intent(ActivityClass.this, ServiceClass.class)); 

<强>重新连接

如果您离开clieant活动(CA)并希望在重新启动应用时重新连接到服务,则有两种选择:

从您的CA再次启动startService。这将再次调用服务中的onStartCommand。仅当服务尚未运行时才会调用服务onCreate()。您可以使用上述启动流程获取服务Messenger;

- 您可以将服务Messenger设为公共和静态public static Messenger mMsgService = null;。因此,当您的CA启动时,它可以检查服务信使是否已初始化(非空)并使用它与服务进行通信。当设置停止时,需要设置mMsgService = null;

祝你好运。

答案 1 :(得分:0)

除了绑定到该服务之外,没有其他方式可以与服务进行通信。将服务绑定到活动中并不是必需的,这意味着服务将(或需要)解锁服务的销毁。如果您不调用unbindService方法,则绑定的服务将始终运行。因此解决方案绑定到服务并且不要调用活动的unbindService onDestroy。