通过在 Android 中调用其 public 函数向服务发送请求是否好?

Is to good to send requests to Service by calling its public functions in Android?

我有一项服务,它负责从 Internet 下载文件。我的服务可以同时下载多个文件 time.I 应该能够从不同的 类 向我的服务发送请求,例如来自 Activities、Fragments 或 NotificationManager。

向服务发送下载请求的最佳方式是什么?。我应该通过 Intent 发送数据还是访问服务的引用并调用它的 public 函数之一更好? 哪一个更好?谢谢

我会说这取决于。如果您需要做的只是给服务一些任务来执行并且您不希望它有任何响应,那么您应该只通过意图发送信息并忘记它。

如果您需要与服务沟通有关下载的信息,例如进度、下载状态和其他类似内容,您可能应该绑定到该服务(如果您使用的是 activity ).

如果您没有使用 activity 并且需要与该服务进行通信,则可以通过多种方式实现通信。您可以使用一个事件接口,服务可以在其中将事件发送给任何关心其下载进度、队列和其他类似信息的人。另一方也可以向服务发送事件,这可能会提示服务响应另一个事件或执行某些任务。这样,您就不会保留对可以随时被 Android 终止的服务的引用。您只会知道,如果您向服务发送事件但没有收到响应,则该服务已停止运行(或者它只是不想响应)。

我建议使用 Intents 来传递信息,而不是保留服务引用来调用它的 public 方法。

我建议您使用 WorkManager 而不是服务。由于服务可以被系统终止以进行优化。 例如

     class DownloadWorker(appContext: Context, workerParams: WorkerParameters):
          Worker(appContext, workerParams) {
                override fun doWork(): Result {

               // Do the work here--in this case, upload the images.
                  downloadFile()

               // Indicate whether the work finished successfully with the Result
               return Result.success()
            }
          }

并且您可以在网络应该连接等限制条件下开始任何和多项工作 像这样:

      /**
       * Constraints
       * Network type is conneted
       */
          mConstraints =new Constraints.Builder().setRequiredNetworkType(NetworkType.CONNECTED).build();

          mRequest = new OneTimeWorkRequest.Builder(DownloadWorker.class).setConstraints(mConstraints)
            .build();
WorkManager
.getInstance(myContext)
.enqueue(mRequest)

WorkManager 确保您的工作 运行。

有关更多信息,请查看:[WorkManager]:https://developer.android.com/topic/libraries/architecture/workmanager/basics