【问题标题】:Android App is FC when "Back" or " Home" is pressed按下“返回”或“主页”时,Android 应用程序为 FC
【发布时间】:2013-04-02 12:12:17
【问题描述】:

我创建了一个播放声音文件的安卓应用。当我按下主页按钮时,我注意到声音继续播放并且没有停止,所以我在我的类中添加了以下函数:

@Override
protected void onStop()
{
    super.onStop();
    finish(); //kill the thread
    pS.reset(); //stop the sound
}
@Override
protected void onPause()
{
    super.onPause();
    finish(); //kill the thread
    pS.reset(); //stop the sound
}

当“返回”或“主页”被按下时,它会停止音乐并且应用程序不会强制关闭。唯一的问题是,必须播放声音才能使其不是 FC。如果没有声音播放,应用程序 FC。 我猜是这个

pS.reset();

函数在不播放声音时不知道该做什么。

如果我将其设置为:

pS = null;

而不是pS.reset(),当按下“Back”或“Home”时,它会在没有FC的情况下做同样的事情吗?

我的 pS 初始化:

pS = MediaPlayer.create(iAct.this, R.drawable.sound);

编辑: 我注释掉了

pS.reset();

并添加

pS = null;

它不 FC 但声音不会停止播放。

我更新了我的 onPause():

@Override
protected void onPause()
{
    super.onPause();
    if (pS.isPlaying()) {
        pS.pause(); //stop the sound
        finish();
    }
    else
        finish();
}

我的日志:

04-02 13:06:40.563: E/AndroidRuntime(925): FATAL EXCEPTION: main
04-02 13:06:40.563: E/AndroidRuntime(925): java.lang.RuntimeException: Unable to pause activity {com.testcom.myapp/com.testcom.myapp.MyappActivity}: java.lang.NullPointerException
04-02 13:06:40.563: E/AndroidRuntime(925):  at android.app.ActivityThread.performPauseActivity(ActivityThread.java:2354)
04-02 13:06:40.563: E/AndroidRuntime(925):  at android.app.ActivityThread.performPauseActivity(ActivityThread.java:2311)
04-02 13:06:40.563: E/AndroidRuntime(925):  at android.app.ActivityThread.handlePauseActivity(ActivityThread.java:2291)
04-02 13:06:40.563: E/AndroidRuntime(925):  at android.app.ActivityThread.access$1700(ActivityThread.java:117)
04-02 13:06:40.563: E/AndroidRuntime(925):  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:938)
04-02 13:06:40.563: E/AndroidRuntime(925):  at android.os.Handler.dispatchMessage(Handler.java:99)
04-02 13:06:40.563: E/AndroidRuntime(925):  at android.os.Looper.loop(Looper.java:123)
04-02 13:06:40.563: E/AndroidRuntime(925):  at android.app.ActivityThread.main(ActivityThread.java:3683)
04-02 13:06:40.563: E/AndroidRuntime(925):  at java.lang.reflect.Method.invokeNative(Native Method)
04-02 13:06:40.563: E/AndroidRuntime(925):  at java.lang.reflect.Method.invoke(Method.java:507)
04-02 13:06:40.563: E/AndroidRuntime(925):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839)
04-02 13:06:40.563: E/AndroidRuntime(925):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597)
04-02 13:06:40.563: E/AndroidRuntime(925):  at dalvik.system.NativeStart.main(Native Method)
04-02 13:06:40.563: E/AndroidRuntime(925): Caused by: java.lang.NullPointerException
04-02 13:06:40.563: E/AndroidRuntime(925):  at com.testcom.myapp.MyappActivity.onPause(MyappActivity.java:119)
04-02 13:06:40.563: E/AndroidRuntime(925):  at android.app.Activity.performPause(Activity.java:3851)
04-02 13:06:40.563: E/AndroidRuntime(925):  at android.app.Instrumentation.callActivityOnPause(Instrumentation.java:1191)
04-02 13:06:40.563: E/AndroidRuntime(925):  at android.app.ActivityThread.performPauseActivity(ActivityThread.java:2341)
04-02 13:06:40.563: E/AndroidRuntime(925):  ... 12 more

【问题讨论】:

  • 首先:你的 Logcat 输出是什么?它应该直接指向您的 FC 的来源。其次:我希望这是一个错字,但是您在覆盖 onPause() 时调用了 super.onStop() !这是不对的,您必须在 onPause 覆盖中调用 super.onPause() 。此外:你为什么要在 onPause/onStop 中完成你的 Activity?
  • 我改成了 super.onPause();
  • 好的,我要做的是按下 HOME 或 BACK,如果正在播放,它应该停止播放音乐。

标签: android android-activity android-mediaplayer


【解决方案1】:

看看这里可能会帮助你解决你的问题:

How to mute and unmute it on the onPause and onResumee

这样你就可以暂停并从它停止的地方开始。

像这样:

全球:

MediaPlayer ourSong;

在您的 OnCreate 中

ourSong = MediaPlayer.create(yourActivity.this, YourSong);
        ourSong.setLooping(true);
ourSong.start();

在你暂停功能

    @Override
protected void onPause()
{
    super.onPause();
    if(ourSong.isPlaying)
    ourSong.pause(); //stop the sound
}

@Override
protected void onResume() 
{
    super.onResume();
    ourSong.start();
}

【讨论】:

  • 我希望在按下 HOME/BACK 时停止音乐,当用户再次访问时,它将从头开始。
  • 好的,但是如果 Activity 没有调用 onStop(),你的音乐就不会再播放了。
  • 你也应该重写 OnResume()
  • 任何人都可以在我的代码上发布我应该拥有的内容吗?会更有帮助:)
  • 检查活动生命周期就像@Kennifer说的:developer.android.com/reference/android/app/…
【解决方案2】:

你可以把 PS.stop 放在 onPause() 中。

【讨论】:

  • onStop 用于 HOME,onPause 用于 BACK……对吗?试过了,还是不行:(
  • Back 用于 onPause,一段时间后它会转到 onStop,当您单击返回按钮时,您需要停止音乐,然后仅在 onPause() 中添加 Ps.stop。
  • 这不一定是真的 - 您可能想在以下位置阅读活动生命周期:developer.android.com/reference/android/app/…
  • 好的,我要做的是按下 HOME 或 BACK,如果正在播放,它应该停止播放音乐。
【解决方案3】:

只需放入 onPause() 中,因为 onStop() / onDestroy() 之类的所有方法都是在 onPause() 之后调用的,这只是 Activity 生命周期的流程,所以只写在 onPause 中。

@Override
protected void onPause()
{
    if(ps.isPlaying)
       pS.stop(); //stop the sound

    super.onStop();
    finish(); //kill the thread
}

可以处理不同的事情,比如需要实现返回和主页按钮,然后实现 onKeyUp/onKeyDown 并检测键并为当前播放曲目执行暂停/停止

【讨论】:

  • 这很有趣,我只是在你发布之前添加了代码,它就像一个魅力!谢谢 :) 那么,我可以完全去掉 onStop 方法吗?
  • 我添加了您的代码,但就像以前一样,如果声音没有播放,当我按下 HOME/BACK 时,它会出现 FC。有什么想法吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-10-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多