gpt4 book ai didi

android - 如何强制停止正在进行的 Intent Service?

转载 作者:塔克拉玛干 更新时间:2023-11-01 21:40:36 26 4
gpt4 key购买 nike

我有一个 intent 服务可以下载几千兆字节的视频。我有一个“停止”按钮,如果不小心点击了“开始”或其他按钮,可以停止下载。我知道这个问题已被问过几次,但对我来说没有有效的答案。

我尝试调用 stopService(),但没有用。这只是调用 IntentService.OnDestroy()。我试图在 onDestroy 中调用 stopSelf(),但也不起作用。

我尝试使用类似标志的东西,但如果 onHandleIntent 已经在运行,则不会调用它,它会等到当前工作完成后再执行。即使这行得通,我也必须有类似巨大的 if 语句的东西,这很糟糕

我唯一的选择真的是将其重写为常规服务吗?

//回答

public class SyncService extends IntentService {

boolean isCanceled;

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

if (intent.hasExtra("action")) {

// Set the canceling flag
isCanceled= intent.getStringExtra("action").equals("cancel");

}
return super.onStartCommand(intent, flags, startId);
}

@Override
protected void onHandleIntent(Intent intent) {

// Clean up the possible queue
if (intent.hasExtra ("action")) {
boolean cancel = intent.getStringExtra ("action"). Equals ("cancel");
if (cancel) {
return;
}
}

...

Get your inputStream from HttpUrlConnection or whatever

...

while ((bytesRead = in.read(buffer)) > 0) {
if (isCanceled) {
isCanceled = false;
break;
}

...
}

}
}

并触发它

Intent intent = new Intent(context, SyncService.class);
intent.putExtra("action", "cancel");
context.startService(intent);

最佳答案

我认为你有两个不同的问题:

  1. 如何停止当前下载

  2. 如何停止排队的下载,应该在当前下载完成后执行

第一个必须是“类似旗帜的东西”,您在下载数据时会检查它。否则,没有什么会阻止您的下载操作。如果您使用的是典型的 HttpUrlConnection 配方,则在您从 HTTP InputStream 读取并写入您的 FileOutputStream 的循环中检查该标志。您通过调用具有特定 Intent 结构的 startService() 来设置该标志,将其标识为“取消”操作。您需要覆盖 IntentService 中的 onStartCommand(),查看 Intent,如果是取消 ,则使用它来设置标志code>Intent,或链接到任何其他类型的 Intent 的父类(super class)。

如果您可能有其他命令排队(场景 #2),您还需要检查 onHandleIntent() 顶部的标志。

关于android - 如何强制停止正在进行的 Intent Service?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16093919/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com