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);
}
因此服务被杀死并且下一个启动服务的请求是有意的。但是之前的任务又开始运行两个执行下载的并行任务。基本上上一个任务并没有被我杀死。
是否有任何工作可以杀死正在进行的服务任务并开始另一项新任务?
答案 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);