直接调用 Service 的方法而不是使用 startService()

Calling a method of Service directly instead of using startService()

我正在尝试使用 bindService() 连接到 Service。 我能够在 ServiceConnectiononServiceConnected() 方法中获得对 Service 的引用。

我的问题是,如果我在 Service 中声明一个方法 say downloadFile() 并通过 Activity 中的 Service 对象调用它,而不是调用 startService() 然后从 onStartCommand() 调用 downloadFile(),那么这两种方法有什么区别?

What is the difference between the two approaches ?

您提出的方法是一种错误的方法,原因有以下三个:

  • 在Android中,ActivityService被认为是app组件.一个组件应该被视为一个独立的实体,其内部方法不被其他人直接调用components/classes。这样的 component 应该使用 Intent 开始,然后留下来做自己的工作。
  • 如果你不调用 startService(),你就永远不会启动 Service。那么您将如何调用其中定义的方法?手动创建 类 的 应用程序组件 的实例在 Android 中是不受欢迎的。你永远不应该做像

    这样的事情
    new Service()
    

    new Activity()
    

    这很糟糕,你会招来很多麻烦。

  • 如果您打算直接从您的 Activity 调用 downloadFile(),那么为什么首先将它放在 Service 中?那不是多余的吗?将它放在 Service 中的原因是下载操作是一个非 UI 任务,不需要用户交互,这就是 Service 的意思。另一方面,Activity 是基于 UI 的组件,明确用于用户交互。如果用户在下载过程中关闭了您的 Activity,那么当下载完成并且您的代码尝试 post UI 上的数据时会抛出 NullPointerException