如何自行停止服务?

我在一个活动中开始一个服务,然后我希望服务一段时间后自行停止。

我在服务中调用了stopSelf(),但它并没有工作。

如何使服务本身停止? 谢谢!!!

通过说“不起作用”,我想你的意思是不调用服务的onDestroy()方法。

我有同样的问题,因为我使用标志BIND_AUTO_CREATE 将一些ServiceConnection 绑定到服务本身。 这将导致服务保持活动状态,直到每个连接被解除绑定 。

一旦我改变使用没有标志(零),我没有任何问题,自己(( stopSelf() ))。

示例代码:

 final Context appContext = context.getApplicationContext(); final Intent intent = new Intent(appContext, MusicService.class); appContext.startService(intent); ServiceConnection connection = new ServiceConnection() { // ... }; appContext.bindService(intent, connection, 0); 

杀死服务(而不是进程):

 this.stopSelf(); 

希望有所帮助。

通过调用stopSelf() ,服务停止。

请确保没有线程在后台运行,使您感觉服务还没有停止。

在你的线程中添加打印语句。

希望这可以帮助。

因为你没有发布你的代码,我不知道你在做什么,但是你必须声明你正在停止的事情:

 this.stopSelf(); 

如下所示:

 public class BatchUploadGpsData extends Service { @Override public void onCreate() { Log.d("testingStopSelf", "here i am, rockin like a hurricane. onCreate service"); this.stopSelf(); } 

如果通过“不起作用”,你的意思是这个过程不会被杀死,那么android就是这样工作的。 System.exit(0)Process.killProcess(Process.myPid())将会终止您的进程。 但是,这不是Android的做事方式。

HTH

  stopForeground(true); stopSelf(); 

我刚刚遇到了同样的问题。 就我而言,我有一个单独的服务pipe理器,用于与服务进行通信。 在经理的服务是这样开始的:

 context.bindService(new Intent(context, MyService.class), serviceConnection, Context.BIND_AUTO_CREATE); 

通过移除Alkelzinbuild议的Context.BIND_AUTO_CREATE,我可以使用this.stopSelf()来停止服务,并在这样做时调用onDestroy()。 这个问题是,之后我无法使用上面的命令从pipe理器重新启动服务。

最后,我通过使用服务的callback来解决这个问题,告诉经理停止服务。 这样,经理总是负责开始/停止服务,一切似乎都正常工作。 我不知道这样做是否有任何反制的迹象。

代码非常简单。 在服务中创build一个callback,并在连接类中将其设置在pipe理器中:

 private ServiceConnection mServiceConnection = new ServiceConnection() { public void onServiceConnected(ComponentName className, IBinder service) { myService = ((MyService.LocalBinder)service).getService(); myService.setCallback(new MyService.MyServiceCallback() { @Override public void onStop() { stopService(); } }); } public void onServiceDisconnected(ComponentName className) { myService = null; } }; 

并停止服务:

 public void stopService() { if(mServiceConnection != null){ try { mContext.unbindService(mServiceConnection); } catch (Exception e) {} } mContext.stopService(new Intent(mContext, BleDiscoveryService.class)); } 

在服务中,只需在需要停止时调用myCallback.onStop()。

这里没有提到的另一个肮脏的黑客是抛出像NPE的exception。 有一天,我需要停止InputMethodService,这个黑客是有用的。

让您的服务停止自己..创build一个BroadcastReceiver类..在您的服务调用您的接收器像这样..

在服务中

 sendBroadcast(new Intent("MyReceiver")); 

在广播接收机中

  public class MyReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { context.stopService(new Intent(context,NotificationService.class)); } } 

清单文件

  <receiver android:name="MyReceiver" android:enabled="true" android:exported="true"> <intent-filter> <action android:name="MyReceiver"/> </intent-filter> </receiver>