从活动中停止服务

时间:2013-03-24 20:23:24

标签: android android-intent android-service

我在停止服务活动方面遇到了问题。

我的服务声明:

public class MyService extends Service implements LocationListener { .. }

按下按钮时会调用此服务:

public void startMyService(View view)
{
    ComponentName comp = new ComponentName(getPackageName(), MyService.class.getName());
    ComponentName service = startService(new Intent().setComponent(comp));
}

在另一种方法中(通过按钮点击启动)我想阻止它:

public void stopMyService(View view)
{
    stopService(new Intent(this, MyService.class));
}

不幸的是,它不起作用。在我看来,这项服务被另一项服务所取代。此外,它累积 - 例如,当我第二次启动服务时,有两个,运行,等等。有人可以帮助我吗?在此先感谢您的帮助。

更新:Android Manifest(仅限我的服务):

<service android:name=".MyService" 
        android:enabled="true" 
        android:exported="false"
        android:label="LocationTrackingService" 
        />

1 个答案:

答案 0 :(得分:1)

您可以向您的服务添加BroadcastReceiver(或静态方法 - 具体取决于您的偏好),然后拨打Context.stopService()stopSelf(),例如添加......

public static String STOP_SERVICE = "com.company.SEND_STOP_SERVICE";

private final BroadcastReceiver stopReceiver = new BroadcastReceiver() {
   @Override
   public void onReceive(Context context, Intent intent) {
      if(intent.getAction().equals(STOP_SERVICE)){
          MyService.this.stopSelf();
      }
   }
};

...为您的服务(假设它被称为MyService)。然后在registerReceiver(stopReceiver, STOP_SERVICE);方法中调用onStartCommand(),在unregisterReceiver(stopReceiver);中调用onDestroy()。最后从您需要停止服务的任何地方发送广播:

Intent intent=new Intent();
intent.setAction(MyService.STOP_SERVICE);
sendBroadcast(intent);

如果你有一些线程,你必须先停止它们(可能你已经启动了服务粘性,是吗?)