Android服务不是单身人士

时间:2013-04-30 21:45:28

标签: java android singleton

我有一个在多个活动中使用/绑定的服务(我仔细地编写了它,以便一个活动在另一个绑定之前解除绑定,在onPause / onResume中)。但是,我注意到服务中的一名成员不会坚持......

活动1:

private void bindService() {
    // Bind to QueueService
    Intent queueIntent = new Intent(this, QueueService.class);
    bindService(queueIntent, mConnection, Context.BIND_AUTO_CREATE);
}

...

bindService();

...

mService.addItems(downloads);     // the initial test adds 16 of them

活动2:

bindService();                             // a different one than activity 1
int dlSize = mService.getQueue().size();   // always returns 0 (wrong)

服务代码:

public class QueueService extends Service {
    private ArrayList<DownloadItem> downloadItems = new ArrayList<DownloadItem();

    // omitted binders, constructor, etc

    public ArrayList<DownloadItem> addItems(ArrayList<DownloadItem> itemsToAdd) {
        downloadItems.addAll(itemsToAdd);
        return downloadItems;
    }

    public ArrayList<DownloadItem> getQueue() {
        return downloadItems;
    }
}

改变一件事 - 将服务的downloadItems变量变成静态变量 - 一切都很完美。但是必须这样做让我担心;我之前从未使用过单身人士。这是使用其中一种的正确方法吗?

2 个答案:

答案 0 :(得分:7)

事实证明Nospherus是正确的;我需要做的就是在startService()旁边拨打bindService()电话,一切都很顺利。

因为多个startService()调用不会多次调用构造函数,所以它们正是我所需要的。 (这对我来说非常懒惰,但它现在有效。我不确定如何检查启动(而不是绑定)服务。)我的代码现在看起来像这样:

Intent queueIntent = new Intent(getApplicationContext(), QueueService.class);
bindService(queueIntent, mConnection, Context.BIND_AUTO_CREATE);
startService(queueIntent);

另见Bind service to activity in Android

答案 1 :(得分:0)

默认情况下,服务始终为Singleton

在给定时间上只能存在一个服务实例。如果服务正在运行,则无法创建服务的另一个实例。期。

  

绑定多个活动

您可以将服务绑定到n个活动。每个绑定独立运行。当您从一个活动迁移到另一个活动时,Activity1所做的更改将在您迁移到Activity2时保留。只有该服务处于活动状态。

enter image description here

  

那为什么在我的情况下更改不会持续?
  要了解这一点,我们应该知道服务的寿命

     

服务的寿命

     

onCreate()onDestroy()之间存在服务

案例1:
enter image description here 情况2: enter image description here