Android -- 如何正确处理onPause/onResume方法?

8
我有一个应用程序,启动时会播放声音并开始/恢复游戏。但是我发现,如果我的应用程序是将手机置于待机状态(屏幕关闭)时最后运行的应用程序,并且我只需按菜单按钮即可查看时间,则手机会在后台播放游戏和声音(实际上应用程序并不可见,只有显示日期/时间的屏幕,但 onResume 必须已经在我的应用程序中被调用)。我应该怎么办呢?有没有一种方法可以辨别是什么重新激活了应用程序,然后添加一个条件语句,仅当应用程序实际可见时才启动游戏?
以下是我的onResume的代码片段:
@Override
    protected void onResume()
    {
        mySaveGame = Utilities.loadSavegame(this);

        //check the savegame
        if(mySaveGame!=null)
        {
            //start game using savegame values
            this.startFromSavedGame(mySaveGame.getIsLevelComplete());   
        }
        else
        {
            //run the 1st-run components
            this.startFirstRun();
        }

        super.onResume();
    }

我能想到的唯一防止游戏在屏幕开启时(即使应用程序不可见)启动的方法是在onPause()的最后一行放置this.finish()... 但这会强制你每次想要返回到它时重新启动应用程序,因为进程本身被杀死了(这很好,因为我的onPause保存持久数据,但这不是一个优雅的解决方案)。请帮忙。
2个回答

8

您是否考虑过使用 onStart()onStop() 来代替 onResume()onPause()


谢谢回复。我已经尝试了onStart()/onStop(),但是得到了相同的结果...即使实际上不可见,游戏仍在后台运行。根据文档,onStart()在onResume()之前调用(所以这就是为什么在我的情况下它不起作用),而onStop()“可能永远不会被调用...” - RyanM
嗯...这听起来像是锁屏没有被正确地视为前台。你在测试哪个设备? - CommonsWare
3
我可以确认,T-Mobile G1(Android 1.6)和Nexus One(Android 2.1)会在屏幕关闭时暂停前台应用程序,并在锁定屏幕出现后恢复该应用程序。但是,不会调用“ onStop()”和“ onStart()”。因此,您应该更改代码以使用“ onStop()”和“ onStart()”,而不是“ onPause()”和“ onResume()”。 - CommonsWare
1
是的,毫无疑问,锁屏的实现方式会使事情变得复杂。一个可以尝试的解决方法是为ACTION_SCREEN_OFF注册一个registerReceiver()。在这一点上,弹出一个AlertDialog,内容类似于“播放已暂停”,并提供“恢复”和“关闭”按钮。如果用户点击“恢复”,则触发您通常在onStart()中执行的逻辑。如果用户点击“关闭”,则结束您的活动。或者类似于此类的操作。 - CommonsWare
你是否使用了onPause来保存状态并停止游戏? - Genry
显示剩余4条评论

4
我遇到了同样的问题(我希望我的音乐播放器在onResume()/onPause()时能够恢复/暂停播放)。我找到的最好的解决方案是,在活动处于前台时暂停和恢复该活动,您可以使用public void onWindowFocusChanged (boolean hasFocus)回调来获取前台的活动。
编辑:这是一个旧的、有些不正确的答案——正确的响应已经在Android Developers Blog中描述:制作友好的安卓游戏

1
你是否注意到在某些设备上,当你调整音量时,onWindowFocusChanged会被调用,hasFocus==false? - Gallal
自从我发布这篇文章以来,Google提供了更好的替代方案,可以在所有设备/固件上正确处理该问题,因此我已经编辑了上面的原始帖子。 - MichalisB

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接