我有一项服务,我在自定义视图中运行。它看起来像这样:
public class CustomListView extends ListView {
private Intent mFetchThumbsIntentService;
private static Context mContext;
public CustomListView(Context context, AttributeSet attrs) {
super(context, attrs);
mContext = context;
}
public void onMyCustomViewCreate() {
mFetchThumbsIntentService = new Intent(mContext, FetchThumbsIntentService.class);
}
...
public void someMethod() {
mContext.startService(mFetchThumbsIntentService);
}
public void hereIWantToStopTheService() {
mContext.stopService(mFetchThumbsIntentService);
}
}
据我了解,当调用hereIWantToStopTheService方法应该已经停止服务时,但是,这种情况并没有发生,服务一直运行直到它自然结束。
有什么想法吗?我究竟做错了什么?非常感谢你。
答案 0 :(得分:0)
IntentService旨在运行,直到它完成为您排队的所有工作(通过启动命令/意图)。当您提前停止服务时,它没有机制来停止此后台工作。如果您不想要此行为,则不应该按原样使用IntentService。相反,您可以实现自己的Service-with-a-worker-thread,例如通过继承IntentService本身。
在您自己的实现中,您可以添加功能,以便在销毁服务后立即停止后台工作。实际上,执行此操作非常重要,因为一旦从您的活动中调用stopService()(与其他地方不同,它将完全适用于任何解析为您的服务的Intent并且不需要是您启动它的意图) ,您的服务被破坏,没有任何东西阻止Android框架杀死您的进程(仍在运行您的工作线程)。所以最好你加入你的工作线程,或者至少让它们以某种方式停止。
将停止后台处理的IntentService扩展示例:
public class MyIntentService extends IntentService {
private static final String TAG = "MyIntentService";
private volatile boolean destroyed;
public MyIntentService() {
super(TAG);
}
@Override
protected void onHandleIntent(Intent intent) {
while (!destroyed) {
Log.d(TAG, String.format("still running, tid=%d", Thread.currentThread().getId()));
try {
Thread.sleep(TimeUnit.SECONDS.toMillis(1));
} catch (InterruptedException e) {
Log.e(TAG, "interrupted while sleeping");
}
}
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
Log.d(TAG, "onStartCommand");
return super.onStartCommand(intent, flags, startId);
}
@Override
public void onDestroy() {
Log.d(TAG, "onDestroy");
super.onDestroy();
destroyed = true;
}} //sorry i don't know how to put this last bracket on next line in SO ;-)
当您将其包含在项目中并以任何意图启动/停止时,您将看到打印"仍在运行"一旦你调用stopService();
就会停止