2011-06-09 45 views
3

我正在基于选项卡式活动构建应用程序。在任何时候都有大约12个选项卡。TabActivity中的“sub”活动是否应该绑定服务?

我已经构建了一个下载服务,供我自己使用,它需要绑定到它。我发现了一些关于从标签中绑定服务的问题,但我还没有找到任何讨论设计这个问题的最佳方法。

我的路径似乎是:

  1. 绑定使用的getParent()或getApplicationContext()作为上下文选项卡的活动的下载服务绑定到。
  2. 在TabActivity中绑定下载服务一次,然后通过静态方法将其暴露给组成选项卡的其他活动。
  3. 重新设计下载服务,使其不需要绑定。 (我不太确定这是一个可行的选择或买我很多)

我基本上在1和2之间折腾。似乎#1似乎使活动更独立,但我不确定是否会导致标签“子”活动在选项卡活动的上下文中绑定相同服务12次的问题。同样,我不确定是否通过静态方法将状态依赖对象(如服务)公开给其他活动是一种好的做法。我担心它可能会产生一些需要考虑的竞争条件,具体取决于绑定发生的时间和标签活动的开始时间。

什么看起来更好的设计?

+0

“下载”服务如何工作?它是否经常在后台执行任务,或者只有在其中一项活动请求时才会尝试进行“按需下载”? – Squonk 2011-06-09 18:51:06

+0

@MisterSquonk它是异步的。当提交下载时,它会进行下载,然后通过回调通知请求的代码。它只有在一段代码请求下载并且执行器服务设置同时运行多达3次下载时才起作用。它还使用md5查找缓存下载,以减少远程资源被拉到设备的次数。 – 2011-06-09 19:01:00

回答

1

服务的主要目的是在后台运行长期任务,即使能够比启动服务的应用程序生存得更长。通过你的下载服务的描述,它似乎只是在应用程序的整个生命周期内处理短期操作。因此,我建议创建一个可以管理缓存并使用工作线程处理下载的单例DownloadManager类。

+0

谢谢你的回答。我认为文档使用这个解释来代替更复杂的解释。事实是,服务是一种在不同应用环境下工作的机制。这对生命周期有影响。对于下载管理器来说,能够创建自己的缓存文件并连接到数据库非常重要。这些事情需要一个Context引用,我对缓存调用下载管理器的活动或服务的Context有很大的疑虑。 – 2011-06-13 13:14:30

+0

研究使用应用程序上下文而不是活动上下文,请参阅http://android-developers.blogspot.com/2009/01/avoiding-memory-leaks.html – 2011-06-13 13:58:17

+0

我最终使下载管理器完全静态并注入应用程序上下文通过扩展应用程序。这实际上工作得很漂亮,并且防止了很多代码“扭曲”,以便通过库移动上下文以获得每个文件的下载。 – 2011-06-17 14:20:58

0

我会设计这个使用Context.startService()而不是绑定。在我看来,当你绑定时,你将服务的生命周期绑定到绑定活动的生命周期。如果生命周期不相关,则应该使用startService()。

如果您使用startService,只要下载完成以通知活动(或更新进度)并且所有下载完成时就可以发送广播,则可以调用Service.stopSelf()关闭服务。

0

您可以为12个选项卡中的所有选项卡设置单个活动,并根据当前选项卡更改内容/视图。您可以将服务绑定到活动对象。我认为这种方法是相关的,因为所有标签都处理同一种任务。使用类似

public class LifeLine extends TabActivity implements TabHost.TabContentFactory { 
public void onCreate(Bundle savedInstanceState) { 
TabHost tabHost = getTabHost(); 
TabHost.TabSpec spec 
spec = tabHost.newTabSpec("Day").setIndicator("Day", 
          res.getDrawable(R.drawable.icon)) 
         .setContent(this); 
tabHost.addTab(spec); 
... 

tabHost.setOnTabChangedListener(new OnTabChangeListener() { 
      @Override 
      public void onTabChanged(String tag) { 
      if ("Day".equals(tag)) {/* Change the view as needed.*/ 
         view.setDuration(1);    
        } else { /* Change the view as needed.*/} 
       view.invalidate(); 
       Log.v("life", tag); 
      } 
     }); 
+0

这是一个选项。该设置目前按照您的描述进行构建,这实际上归结为“绑定父活动并向服务注入/提供服务”或“绑定到选项卡”。感谢您的输入。 – 2011-06-17 14:15:29

相关问题