0

我的应用是一款专为 1 至 3 岁儿童设计的游戏(我自己有两个在这个范围内!)

我试图尊重开发生命周期,遵循应用程序设计指南,让体验从头到尾,完全符合用户(父母和小孩)的期望。

游戏开始时,我通过实现 AudioManager.OnAudioFocusChangeListener 的服务启动(和平的)背景音乐(根据焦点启动、更改音量级别、关闭等),在活动之间切换时持续进行游戏而不会中断,但是可以选择在每个游戏屏幕上以小按钮的形式打开和关闭。

一切都按我的预期工作,除非我按下主页按钮以 Android 方式退出应用程序(即没有退出按钮/选项)。音乐无限期地继续播放。我的开关有什么可以改变的吗(见下面的代码)?我不能告诉服务在暂停时停止,因为这会破坏活动之间的无缝背景音乐。

这是一个违背典型应用程序设计的案例,可以创建一个退出选项(当一个可爱的小动物按下家时提示“现在说再见?”以及退出和取消按钮)?还有其他选择吗?

与往常一样,感谢您在我跌跌撞撞时指导我!=)

@Override
public void onAudioFocusChange(int focusChange) {
    // TODO Auto-generated method stub 
    switch (focusChange) {
    case AudioManager.AUDIOFOCUS_GAIN:
        Log.v(TAG, "AUDIOFOCUS_GAIN");
        // resume playback
        if (mp == null)  {mp = MediaPlayer.create(this, R.raw.backgroundmusic); mp.start(); mp.setLooping(true);}
        else if (!mp.isPlaying()) mp.start();
        mp.setVolume(1.0f, 1.0f);
        break;

    case AudioManager.AUDIOFOCUS_LOSS:
        Log.v(TAG, "AUDIOFOCUS_LOSS");
        // Lost focus for an unbounded amount of time: stop playback and release media player
        if (mp.isPlaying())mp.stop();
        mp.release();
        mp = null;
        break;

    case AudioManager.AUDIOFOCUS_LOSS_TRANSIENT:
        Log.v(TAG, "AUDIOFOCUS_LOSS_TRANSIENT");
        // Lost focus for a short time, but we have to stop
        // playback. We don't release the media player because playback
        // is likely to resume
        if (mp.isPlaying()) mp.pause();
        break;

    case AudioManager.AUDIOFOCUS_LOSS_TRANSIENT_CAN_DUCK:
        Log.v(TAG, "AUDIOFOCUS_LOSS_TRANSIENT_CAN_DUCK");
        // Lost focus for a short time, but it's ok to keep playing
        // at an attenuated level
        if (mp.isPlaying()) mp.setVolume(0.1f, 0.1f);
        break;
    }
}
4

1 回答 1

1

是的,这是 Android 中非常常见的问题。您的应用程序可以随时从任何活动进入后台,并且当这种情况发生时,您的应用程序不会收到任何类型的回调。希望他们可以在未来的版本中解决这个问题。

话虽这么说,有很多方法可以实现你想要的,但它会比你想象的要复杂得多。 对于您正在寻找的内容,这是一个很好的答案。

于 2013-08-14T15:50:20.717 回答