Android区分App-in-Background和Rotation Event

时间:2012-10-05 00:51:48

标签: android android-service audio-recording android-lifecycle

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

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

  1. 在生命周期事件期间保持服务运行,最终成为设备轮换。
  2. 将应用程序置于后台时停止服务(以释放麦克风)。
  3. 我无法覆盖onConfigurationChanged,因为我的应用程序使用带有编程添加的片段的操作栏标签,并且无法重新填充片段布局。

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

3 个答案:

答案 0 :(得分:2)

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

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();

         }
    }

答案 1 :(得分:1)

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

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

答案 2 :(得分:0)

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

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

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

我自己还没有使用过服务,但是对Bound Service Lifecycle进行仔细检查会有所帮助。