即使在完成活动后也无法停止MusicPlayer。

时间:2015-09-15 09:02:36

标签: java android

我已将MediaPlayer设置为播放不同的歌曲。但是,当我尝试关闭应用程序时,活动将关闭,但该歌曲仍在后台运行。这是我编码的方式!

    try {
        mp.setDataSource(text);
        mp.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
            public void onPrepared(MediaPlayer mp) {
                mp.start();
            }
        });

        mp.prepare();
        mp.setVolume(0.4f, 0.4f);

        songPlayer.setDataSource(song);
        songPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
            public void onPrepared(MediaPlayer songPlayer) {
                songPlayer.start();
            }
        });

        songPlayer.prepare();
        songPlayer.setLooping(true);

        voicePlayer.setDataSource(voice);

        voicePlayer.setLooping(true);
        voicePlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
            public void onPrepared(MediaPlayer voicePlayer) {
                voicePlayer.start();
            }
        });
        voicePlayer.prepare();
        voicePlayer.setVolume(0.5f,0.5f);

    }
    catch (IllegalArgumentException e) {
        e.printStackTrace();
    } catch (SecurityException e) {
        e.printStackTrace();
    } catch (IllegalStateException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }

    catch (IllegalMonitorStateException e)
    {
        e.printStackTrace();
    }

    //THIS IS WHERE I THINK THE ERROR IS : 
    //WHERE `mp` IS LOOPED WITH DELAY OF 5000ms
    try {
        final Handler hlr = new Handler();

        final Runnable looper = new Runnable() {
            @Override
            public void run() {

                if (mp != null) {

                    if (mp.isPlaying()) {
                        mp.stop();
                    }

                }


                mp.start();

            }
        };


        mp.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
            public void onCompletion(MediaPlayer mp) {
                hlr.postDelayed(looper, 5000);
            }
        });

    }
    catch(IllegalStateException e)
    {
        e.printStackTrace();

    }



    }


}

还有一种方法可以在指定时间后重新启动活动。该活动的代码是:

public void snoozeup(View view)
{
    SharedPreferences sa = getSharedPreferences("SnoozeList", Context.MODE_PRIVATE);
    int snox = sa.getInt("SnoozeX",0);

    if(snox==2) {

        Handler handler = new Handler();
        Runnable x = new Runnable() {
            @Override
            public void run()
            {
                Intent intent = new Intent(Time_Date.this, Time_Date.class);
                intent.putExtra("finisher", state);

                startActivity(intent);

            }
        };
        handler.postDelayed(x, 120000);

    }


    else
    {
        Handler handler = new Handler();
        Runnable x = new Runnable() {
            @Override
            public void run() {
                startActivity(new Intent(Time_Date.this, Time_Date.class));
            }
        };
        handler.postDelayed(x, 180000);

    }

    try
    {
        if (mp != null && mp.isPlaying())
        {
            Log.d("TAG------->", "mp is running");
            mp.stop();
            Log.d("TAG------->", "mp is stopped");
            mp.reset();
            mp.release();
            Log.d("TAG------->", "mp is released");
            mp=null;
        }

        if (voicePlayer != null && voicePlayer.isPlaying()) {
            Log.d("TAG------->", "voiceplayer is running");
            voicePlayer.stop();
            Log.d("TAG------->", "voiceplayer is stopped");
            voicePlayer.release();
            Log.d("TAG------->", "voiceplayer is released");
        }


        if (songPlayer != null && songPlayer.isPlaying()) {
            Log.d("TAG------->", "songplayer is running");
            songPlayer.stop();
            Log.d("TAG------->", "songplayer is stopped");
            songPlayer.release();
            Log.d("TAG------->", "songplayer is released");
        }
    }
    catch(Exception e)
    {
        e.printStackTrace();
    }


    finish();
}

问题在于mp。其他MediaPlayer实例被停止。但不是mp。遗憾的是,在logcat中也看不到任何错误。那我在哪里做错了?任何帮助将不胜感激。

3 个答案:

答案 0 :(得分:1)

您正在销毁您的活动,但您也需要停止/销毁您的媒体播放器。请在活动中写下以下代码。

@Override
    public void onDestroy() {
        super.onDestroy();
        if (mp!= null) {
         //destory ur object here.   
        }
    }

答案 1 :(得分:1)

要停止播放音乐,您应将此代码放入onPause()方法。

此方法可以从您继承自Activity

的类中重写
@Override
protected void onPause() {
    super.onPause();
    mp.stop
}

您还可以查看Managing the Activity Lifecycle,以便更好地了解Android如何管理某项活动。

答案 2 :(得分:0)

加入onPause()onDestroy()示例:

@Override
protected void onPause() {
    super.onPause();
    mp.stop();
}