stopService(intent_with_extras) - 你如何从服务中读取这些额外内容以停止?

Posted

技术标签:

【中文标题】stopService(intent_with_extras) - 你如何从服务中读取这些额外内容以停止?【英文标题】:stopService(intent_with_extras) - how do you read those extras from within the service to stop? 【发布时间】:2011-06-09 07:11:57 【问题描述】:

我有一个可以通过多种方式停止的服务。每当我调用 stopService(Intent) 时,我都会传递一个带有一些额外内容的意图。你如何找回那些额外的东西?

谢谢。

【问题讨论】:

How to get the intent that stops the service in android的可能重复 【参考方案1】:

您需要在您的Service 中覆盖onStartCommand(),这是您从startService 获得对传入意图的引用的方式。

在这种情况下,您的意图中会有一个特殊操作来告诉服务自行停止。您可以在此意图中添加额外内容,这些内容可以在 onStartCommand() 方法中读取。

示例代码

public class MyService extends Service 
    @Override
    public int onStartCommand(final Intent intent, final int flags, final int startId) 
         final String yourExtra = intent.getStringExtra(YOUR_EXTRA_ID);
         // now you can e.g. call the stopSelf() method but have the extra information
    

说明

每次你调用context.startService(Intent)onStartCommand()都会被调用。如果服务已在运行,则不会创建新服务,但仍会调用 onStartCommand。这就是您可以通过附加到正在运行的服务获得新意图的方式。

【讨论】:

你提到了对来自 startService 的传入意图的引用,你的意思是 stopService 吗?你有一个基本的例子吗? 每次调用 context.startService(Intent) startCommand 都会被调用。如果服务已经在运行,则不会创建新服务,但仍会调用 startCommand。这就是您如何获得正在运行的服务的新意图。希望这会有所帮助。 这是一个公认的答案吗?未解决从 stopService 请求中读取 extras 的问题。【参考方案2】:

我发现调用 stopService 时 extras 并没有按意图传递。作为一种解决方法,只需依次调用 startService(Intent) 和 stopService(Intent)。

来自 Activity 的示例代码:

Intent j = new Intent(SocketToYa.this, AccelerometerDataSocket.class); j.putExtra("com.christophergrabowski.sockettoya.DestroyService", true); startService(j); stopService(j);

在 Service.onStartCommand 中,

intent.hasExtra("com.christophergrabowski.sockettoya.DestroyService")

将评估为真,您将按照 API 预期的方式销毁您的服务(即,通过调用 stopService,在调用 onStartCommand 后依次调用 OnDestroy)。

【讨论】:

不喜欢这样,因为如果 onDestroy 的调用速度比 onStartCommand 快,这可能会导致竞争条件,还是我错了?我在某处读到,有意的方法是使用 startService() 与服务进行所有通信,包括停止服务(带有附加功能)。 onStartCommand() 的文档中,它说不要将startService() 用于发送到服务的小消息,因为存在更大的开销(生命周期)。【参考方案3】:

我的建议是在扩展 Activity 的类中使用静态成员,以便将信息传递给服务,并将其作为外部类中的正常静态成员访问来提供服务

除非您别无选择,否则请不要这样做。您应该尝试使用框架内置的机制来传递数据,除非没有其他选择,否则不要使用public static 字段。阅读Servicedocumentation 了解示例。

【讨论】:

【参考方案4】:

您能否通过 Context.startService() 使用带有“关闭”操作的 Intent?

即向Service.onStartCommand()发送一个带有关闭动作和extra的Intent,根据extra决定如何关闭,然后使用Service.stopSelf()停止服务。

我同意这不是一个很好的解决方案,因为它可能会启动服务以将其关闭。我仍然想听听使用 Context.stopService() 执行此操作的“正确”方式(如果存在的话)。

【讨论】:

【参考方案5】:

你不会写

getIntent()

类中的方法扩展服务。所以我认为使用 getExtra() 是行不通的。 我的建议是在扩展 Activity 的类中使用静态成员,以将信息传递给服务,并将其作为外部类中的正常静态成员访问,即

类名.你的对象

。 请参阅此链接以获取其他选项 http://developer.android.com/resources/faq/framework.html#3

【讨论】:

"要在应用程序中的活动/服务之间共享原始数据,请使用 Intent.putExtras()" 我这样做了,现在我想在 onDestroy() 中为我的服务检索它们。 虽然您仍然无法使用 getIntent,但您仍然可以使用 startCommand 处理您的 Intent。 对基本数据类型使用静态成员没有意义。使用 Intents 和 Extras(尽可能)在服务/活动之间进行通信是常见的 Android 做法。 schwiz 的回答对我来说似乎更有用。

以上是关于stopService(intent_with_extras) - 你如何从服务中读取这些额外内容以停止?的主要内容,如果未能解决你的问题,请参考以下文章

安卓学习之服务基本用法

用bind的方法启动service,调用者退出后,service也销毁?

以编程方式停止粘性服务

如何获得在android中停止服务的意图

Service 两种启动方式

Android Service详解