2

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

为此,我必须使用startService,但以前我使用bindService的是在被调用后向(在服务中)ServiceConnection发送消息的地方。handleronServiceConnected

但是我不知道如何使用 a 发送消息,startService因为我没有任何地方onServiceConnected可以将消息发送给处理程序。

注意:我想继续运行我的服务,即使我不在我的应用程序中,因为我正在从我的服务更新小部件。

所以一个服务有两个角色

  1. 更新活动内的文本视图
  2. 一旦活动退出,服务将更新小部件
4

2 回答 2

4

您有 3 个选项与您的服务进行通信:

  • 为意图添加额外内容并调用 startService。您可以多次调用它,即使该服务已经在运行
  • 创建一个 Messenger 并使用它与服务进行通信
  • 使用绑定服务

请务必START_STICKY在您的服务中使用,以便在活动完成后继续运行,并startForeground()显示通知,否则您的服务将在一段时间后(平均为 30 分钟到 1 小时)被 SO 杀死。

起始流程:

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

有了这个,客户端和服务器就可以知道对方的 Messenger 地址,并且不需要绑定。

停止服务:

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

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

重新连接:

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

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

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

祝你好运。

于 2012-10-09T11:41:32.643 回答
0

除了绑定到该服务之外,没有其他方法可以与该服务进行通信。在活动中绑定服务并不一定意味着服务将(或需要)解除绑定 onDestroy 服务。如果不调用 unbindService 方法,则绑定的 Service 将一直运行。所以解决方案是绑定到服务上,不要调用活动的 unbindService onDestroy。

于 2012-10-09T10:34:10.593 回答