android中的stopService无法正常工作,我不明白什么?

时间:2014-08-13 08:24:56

标签: android android-service

我有一项服务,我在自定义视图中运行。它看起来像这样:

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方法应该已经停止服务时,但是,这种情况并没有发生,服务一直运行直到它自然结束。

有什么想法吗?我究竟做错了什么?非常感谢你。

1 个答案:

答案 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();

就会停止