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
}
}
这是我用来下载文件并解析它的 Intent 服务。现在,如果我收到新的文件下载请求,我必须清除正在进行的任务并开始下载新请求以取消旧请求。所以我使用下面的代码来完成它:.
private void refreshSync() {
context.stopService(new Intent(context, DataManager.class));
final Intent mServiceIntent = new Intent(context, DataManager.class);
mServiceIntent.putExtras(bundle);
context.startService(mServiceIntent);
}
因此服务被终止,下一个启动服务的请求是有意的。但是之前的任务再次开始运行两个并行任务来执行下载。基本上,之前的任务并没有像我打算的那样被杀死。
是否有任何解决方法可以终止服务的正在进行的任务并启动另一个新任务?
最佳答案
不要使用 IntentService
。这不符合你的要求。 IntentService
是一个简单的Service
,它接受工作队列并处理队列,然后在队列为空时自行关闭。
您需要更多智能,最好自己实现。只是 extend Service
而不是 IntentService
。在 onStartCommand()
中启动一个下载数据的后台 Thread
。在 Service
的成员变量中跟踪该后台 Thread
。如果再次调用 startService()
,请检查您是否已经在进行下载。如果是这样,停止它并启动一个新的后台 Thread
来下载新文件。要停止后台线程,您应该在 Thread
中提供一个 boolean
变量,在下载循环中不时检查该变量。如果该变量的状态发生变化,则意味着 Thread
应该停止。这是 Java 中停止后台线程的标准机制。
关于android - 同一 Intent 服务并行运行多个后台任务(问题),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45772632/