3

我的基本问题是弄清楚如何确定我的应用程序何时被置于后台与进行轮换。

我有一个用于音乐识别的录音服务。我想智能地管理此服务的生命周期以完成以下任务:

  1. 在最终成为设备轮换的生命周期事件期间保持服务运行。
  2. 当应用程序进入后台时停止服务(以释放麦克风)。

我无法覆盖onConfigurationChanged,因为我的应用程序使用带有以编程方式添加的片段的操作栏选项卡,并且无法重新膨胀片段布局。

克服这些挑战的好方法是什么?到目前为止,我最好的解决方案是更新服务中的计时器,但我想考虑替代方案。我不喜欢计时器,因为在使用语音搜索时经常会出现麦克风争用。

4

3 回答 3

3

您可以致电getChangingConfigurations()isChangingConfigurations()onPause(). 这会告诉你方向是否正在改变。如果不是,那么它可能会进入后台。

此外,您可以覆盖onCongifurationChanged(),只需确保您调用super.onConfigurationChanged(),以便框架处理方向更改。

于 2012-10-05T01:14:18.330 回答
3

要检测您的应用是否已进入后台,您可以在 Activity 中使用以下代码:

public void onWindowFocusChanged(boolean hasFocus) {

    super.onWindowFocusChanged(hasFocus);

    if (hasFocus)
Toast.makeText(this, "ON TOP", Toast.LENGTH_SHORT).show();
    if (!hasFocus) {
Toast.makeText(this, "ON BACK", Toast.LENGTH_SHORT).show();

         }
    }
于 2012-10-06T06:59:58.957 回答
0

我很困惑为什么你不能覆盖 onConfigurationChanged - 为什么你不能以你创建它们的相同方式重新膨胀片段布局?

在绑定的服务中,系统不应该根据活动的应用程序/活动是否绑定到它来控制运行/关闭您的服务吗?您是基于应用程序上下文(在方向更改后持续存在)还是活动上下文(瞬态)绑定到服务?也许尝试在你的代码中切换它,看看你是否得到了你正在寻找的行为。

编辑:也许您需要 onStartCommand/stopServicebindService 的混合解决方案。已启动的服务似乎允许在 Activity 生命周期之外保持持久性,但也允许您将状态数据从一个绑定的 Activity 传递到下一个(通过 onBind/onRebind)。不确定这些数据是否对您的片段有帮助,但您至少可以传递一个标志,告诉您这是“新鲜”还是“回收”活动。

我自己还没有使用过服务,但仔细检查绑定服务生命周期可能会有所帮助。

于 2012-10-05T01:31:18.040 回答