同一个Intent Service并行运行多个后台任务(ISSUE)

时间:2017-08-19 14:19:41

标签: android android-service android-intentservice

public class DataManager extends IntentService {
    @Override
    public void onCreate() {
        super.onCreate();
    }

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {

    }

    @Nullable
    @Override
    public IBinder onBind(Intent intent) {
        return null;
    }

    @Override
    public void onDestroy() {
        super.onDestroy();
    }

    public DataManager() {
        super("DataManager");
        setIntentRedelivery(true);
    }

    @Override
    protected void onHandleIntent(final Intent intent) {
        // download and parsing task done here
    }
}

这是我的意图服务,我用它来下载文件并解析它。现在,如果我收到文件下载的新请求,我必须清除正在进行的任务并开始下载以取消旧请求的新请求。所以我用下面的代码来做:。

private void refreshSync() {
    context.stopService(new Intent(context, DataManager.class));
    final Intent mServiceIntent = new Intent(context, DataManager.class);
    mServiceIntent.putExtras(bundle);
    context.startService(mServiceIntent);
}

因此服务被杀死并且下一个启动服务的请求是有意的。但是之前的任务又开始运行两个执行下载的并行任务。基本上上一个任务并没有被我杀死。

是否有任何工作可以杀死正在进行的服务任务并开始另一项新任务?

2 个答案:

答案 0 :(得分:2)

请勿使用IntentService。这与您的要求不符。 IntentService是一个简单的Service,它接受​​一个工作队列并处理队列,然后在队列为空时自行关闭。

你需要更多智慧,而你最好自己实施。只需extend Service而不是IntentService。在onStartCommand()中启动下载数据的后台Thread。跟踪Thread中成员变量中的背景Service。如果再次调用startService(),请检查您是否已在进行下载。如果是这样,请将其停止并开始新的后台Thread以下载新文件。要停止后台线程,您应该在boolean中提供Thread变量,该变量会在下载循环中不时被检查。如果该变量的状态发生变化,则意味着Thread应该停止。这是在Java中停止后台线程的标准机制。

答案 1 :(得分:1)

您正在设置setIntentRedelivery(true);,如果未完全处理(如果onHandleIntent无法返回),则会强制意图使服务调用无效。考虑到IntentService只有一个工作线程(一次只能执行一个任务)这一事实,服务的行为完全取决于onHandleIntent实现。因此,您需要分析实施并根据您的目标进行更改,或者设置setIntentRedelivery(false);