简体   繁体   中英

Android App is FC when “Back” or “ Home” is pressed

I created an android app which plays a sound file. When I press the home button I noticed that the sound continues to play and does not stop so I added the following function inside my Class:

@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
}

Which does the job when "Back" or "Home" is pressed, it stops the music and the app does not force close. The only issue is, the sound has to be playing for it to not FC. If there is no sound playing, the app FC. I am guessing it's the

pS.reset();

function not knowing what to do when the sound isn't playing.

If i set it to:

pS = null;

rather than pS.reset(), will it do the same without FC when "Back" or "Home" is pressed?

My pS initialization:

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

EDIT: I commented out

pS.reset();

and added

pS = null;

it does not FC but the sound does not stop playing.

I updated my onPause():

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

My Log:

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

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

just put into the onPause() because all the method like onStop() / onDestroy() are called after onPause() only that was the flow of life cycle of Activity so just write only in onPause.

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

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

ok for different thing like need to implement for back and home button then implement onKeyUp/onKeyDown and detect the key and perform pause/stop for your current play track

Take a look here might helps you with your issue:

How to mute and unmute it on the onPause and onResumee

With that you can pause and start it where it stopped.

Like this:

Global:

MediaPlayer ourSong;

In your OnCreate

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

In you pause function

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

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

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM