【问题标题】:Convert activity to service (android)将活动转换为服务 (android)
【发布时间】:2012-07-12 22:34:32
【问题描述】:

我正在开发一个应用程序,旨在获取有关用户位置和当前天气的信息。信息以这种方式收集: StartGathering --> 获取纬度/经度 --> 从坐标中获取位置数据(城市、地址等) --> 获取天气信息 --> 将信息保存在 SQL 数据库中。 一切都是通过使用 bundle 在包含数据的不同活动之间发送一个字符串数组来完成的。 为了准确起见,该过程每 X 分钟重复一次,但由于我处理过活动,因此更新过程会干扰设备上的其他应用程序。我为进程中的每个活动添加了 android:theme="@android:style/Theme.NoDisplay",认为这与在后台执行此操作相同。 我希望在后台收集信息并将其保存在数据库中,据我所知,如果不使用服务,这是不可能的。

有没有一种方法可以轻松地将一堆不同的活动转换为服务,从而允许应用在后台收集必要的信息,以便用户可以使用设备而不会造成任何性能损失? 或者活动是否可以在不干扰其他应用程序的情况下在后台做一些工作?

【问题讨论】:

  • 我不知道字面上是怎么做的。但我想尝试启动一个异步任务并在完成主要意图后进行循环。我不知道它是否有效,但我只是试一试:)

标签: android eclipse service android-activity


【解决方案1】:

有没有办法轻松地将一堆不同的活动转换为服务...

不,创建一个Service(或Services)并复制/粘贴您现有的代码。请注意,尽管Service 在应用程序的主线程(也称为UI 线程)上运行,所以如果有任何时间- 要完成的工作需要使用工作线程,或者可能使用IntentService,默认情况下它在后台/工作线程上工作。

或者活动是否有可能在不干扰其他应用程序的情况下在后台做一些工作?

不,不是您尝试这样做的方式。将Activity 视为类似于Windows 窗体(或类似形式)。换句话说,它是一个允许用户与应用程序交互的 UI 框架。在Activity(例如使用AsyncTask)中有很多方法可以进行后台工作,但是Activity 不是一个通用类,它可以在进行一些“数字运算”时隐藏起来。

【讨论】:

  • 感谢您的回答!在使用服务时,我是否仍可以使用相同的方法和发送/接收捆绑包?我还能以同样的方式编程,一个服务做一些工作,然后在它自己销毁之前,它会向另一个服务发送一个包,该服务使用前一个服务的信息做一些其他工作?
  • @Eric :是的,Service 可以启动或绑定到另一个 Service。至于传递数据,Android 广泛使用Intents 在应用程序的不同组件之间传递动作和传递数据。我想知道你是否真的需要不止一个Service。如果您的应用程序的“收集”过程始终是按照您描述的固定步骤完成的,那么为什么不在一个 Service 内完成呢?拥有多个Services 的唯一原因是,如果每个都执行可能直接用于其他应用程序组件的独特功能。
【解决方案2】:

从而允许应用在后台收集必要的信息,以便用户可以在不损失任何性能的情况下使用设备

如果您的程序正在执行任何操作,那么您正在造成“性能损失”,可能并不显着或不明显(对用户而言),但仍然会造成损失。在我看来,您正在尝试做的事情(获取位置并发出网络请求以每 X 分钟获取与位置相关的天气信息)将导致电池大量消耗,具体取决于您使用的间隔时间。如果您不希望他们抱怨您的应用程序耗尽了他们的电池,我建议您将间隔时间留给您的用户。

【讨论】:

  • 我的意思是“没有任何显着的性能损失”。当我在手机上测试该应用程序并收集活动信息时,基本上不可能同时使用它。当然,用户可以配置收集信息的频率。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-06-21
  • 2016-08-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多