如何自行停止服务?
我在一个活动中开始一个服务,然后我希望服务一段时间后自行停止。
我在服务中调用了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>