我有一个可以多种方式停止的服务。每当我调用stopService(Intent)时,我都会传递一些额外的意图。你如何找回那些额外的东西?
感谢。
答案 0 :(得分:6)
您需要覆盖onStartCommand()
中的Service
,这就是您从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
。这就是你如何通过额外服务获得正在运行的服务的新意图。
答案 1 :(得分:4)
我发现在调用stopService时,附加内容不会与intent一起传递。作为一种解决方法,只需紧接着调用startService(Intent)和stopService(Intent)。
活动的示例代码:
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")
将评估为true,并且您将按照API的预期方式销毁您的服务(即,通过调用stopService,在调用onStartCommand之后将调用OnDestroy)。
答案 2 :(得分:1)
我的建议是在类中使用静态成员来扩展Activity以将信息传递给服务&amp;它在服务中作为外部类中的正常静态成员访问
除非您没有其他选择,否则请不要这样做。您应该尝试使用框架中内置的机制来传递数据,而不是使用public static
字段,除非没有其他选择。请阅读Service
documentation以获取示例。
答案 3 :(得分:1)
您是否可以使用带有Context.startService()的“关闭”操作的Intent?
也就是说,向Service.onStartCommand()发送带有关闭操作和附加内容的Intent,根据附加内容决定如何关闭,然后使用Service.stopSelf()来停止服务。
我同意这不是一个很好的解决方案,因为它可能会启动服务以关闭它。我仍然希望听到使用Context.stopService()执行此操作的“正确”方法(如果存在)。
答案 4 :(得分:-1)
你不能写
getIntent()
扩展Service的类中的方法。所以我认为使用getExtra()是行不通的。 我的建议是在类中使用静态成员来扩展Activity以将信息传递给服务&amp;它在服务中作为外部类中的正常静态成员访问,即
Classname.yourobject
。 请参阅此链接以获取其他选项 http://developer.android.com/resources/faq/framework.html#3