android - 同一 Intent 服务并行运行多个后台任务(问题)

标签 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
    }
}

这是我用来下载文件并解析它的 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/

相关文章:

android - stopSelf() 是否保证服务停止(以及如何)?如果是这样,是否需要返回(以防内部调用 stopSelf)?

安卓工作室 : Using CheckBox to set EditText enabled

android - Android 中的前台通知启动新 Activity(通过 pendingIntent)而不是现有 Activity

android - KitKat 的动画问题

android - 如何在 android 中以编程方式发送 whatsapp 消息?

绑定(bind)到远程服务时的 Android 应用程序生命周期

android - 如何从 JobIntentService 中删除重复的 Intent

android - 如何避免在具有不同功能的数据库中同时使用同一张表

android - Koin 依赖项覆盖在测试中不起作用