如何在没有重新启动的情况下在活动之间共享服务?

时间:2012-04-16 05:51:41

标签: android android-service android-activity

我正在使用SDK编写SIP应用程序。我的应用程序有很多活动,因此我使用服务的onCreate和onDestroy方法初始化和关闭SDK,以便我可以在应用程序的持续时间内运行它(而不仅仅是单个活动)。

我正在使用的示例应用程序调用startService然后泄漏服务 - 我不想这样做但我不确定我有其他选择。

喜欢做的事情是在我的Activity基类的OnCreate方法中使用Context.BIND_AUTO_CREATE绑定到服务,并在OnDestroy中取消绑定。我的所有活动都从此延伸,因此我可以在我的所有活动中使用该服务。

但是,当配置发生变化或切换活动时会发生什么?该服务是否在活动之间的短暂时段内被强行杀死,或者是否保证不会?如果是前者,那么服务的使用是否会略微瘫痪?我应该使用什么样的设计模式来使完全我的应用程序的生命周期持续存在?

2 个答案:

答案 0 :(得分:3)

我意识到我问的是错误的问题。我假设应用程序将在用户完成时销毁,它可能不会,它只会坐在后台,我的服务也是如此。我想我需要重新设计。

此外,如果我真的想继续沿着这条路走下去(我现在没有),我可以将服务绑定到我的应用程序,它将在应用程序的生命周期中存在(我记得,这将是无限期,除非用户杀死它或Android回收它)。在这种情况下,我不需要专门调用unbind,因为绑定将随应用程序一起被销毁。

答案 1 :(得分:2)

在活动中,启动使用startService() 绑定到服务的服务。如果配置发生更改,这将使您的服务保持活动状态。

取消绑定来自您活动的onDestroy()中的服务。该服务仍将在您启动时运行,而不仅仅是绑定它。

在启动器活动中保留一个静态计数器变量。将其onCreate()中的其他活动启动次数增加1,并将其onDestroy()减1。因此,如果已经打开了3个活动并且假设您将其他2个活动保持在后台堆叠中,则静态计数器为3。现在每个onDestroy()减少计数器并检查它是否为零,停止服务。

在我的FirstActivity(启动器)中,我有public static int counter = 0;

然后在每个活动中:

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    FirstActivity.counter++;
}

@Override
protected void onDestroy() {
    super.onDestroy();

    if (--FirstActivity.counter == 0) {
        stopService(new Intent(this, MyService.class));
    }
}