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
字段。阅读Service
documentation 了解示例。
【讨论】:
【参考方案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) - 你如何从服务中读取这些额外内容以停止?的主要内容,如果未能解决你的问题,请参考以下文章