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

时间:2011-01-14 17:23:39

标签: android service android-intent

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

感谢。

5 个答案:

答案 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