我如何销毁活动?

时间:2014-07-17 12:00:48

标签: android android-activity android-mediaplayer

我有一个循环所有按钮和一个停止按钮。当我还在页面上时,两个按钮都能正常工作。问题是,当我按下loop-all按钮时,它会按照预期播放一系列音频文件,但是当我离开页面时(即按下电话的后退按钮)并返回页面,音频没有停止!我按下停止按钮,但它什么也没做。阻止它的唯一方法是进入任务管理器并结束程序。在我看来,一旦我离开页面,mp2的引用就会丢失......有没有人对如何解决这个问题有任何建议。任何帮助,将不胜感激。这是代码:

                      public class OneVoc extends ActionBarActivity {

private ListView lv;
private MediaPlayer mp;
private MediaPlayer mp2;
int[] myAudio = {R.raw.v_1100, R.raw.v_1101, R.raw.v_1102, R.raw.v_1103, R.raw.v_1104, R.raw.v_1105,
        R.raw.v_1113, R.raw.v_1106, R.raw.v_1107, R.raw.v_1108, R.raw.v_1109, R.raw.v_1110, R.raw.v_1112, 
        R.raw.v_1114, R.raw.v_1115, R.raw.v_1116};
int mCompleted = 0;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.one_voc);

    Button btnLoop = (Button) findViewById(R.id.button1);
    Button btnStop = (Button) findViewById(R.id.button2);

    btnStop.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View v) {
            // TODO Auto-generated method stub
            if (mp2 != null) {

                if (mp2.isPlaying()) {
                    mp2.setOnCompletionListener(null);
                    mp2.stop();

                }
                mp2.reset();
                mp2.release();
                mp2 = null;
            }


            }
    });

    btnLoop.setOnClickListener(new OnClickListener() {



        @Override
        public void onClick(View arg0) {

            mp2 = MediaPlayer.create(getBaseContext(), myAudio[0]);
            mp2.setOnCompletionListener(new OnCompletionListener() 
            {
                @Override
                public void onCompletion(MediaPlayer mp2)
                {
                    mCompleted++;
                    mp2.reset();
                    if (mCompleted < myAudio.length) 
                    {
                        try
                        {
                            AssetFileDescriptor afd = getResources().openRawResourceFd(myAudio[mCompleted]);
                            if (afd != null) 
                            {
                                mp2.setDataSource(afd.getFileDescriptor(), afd.getStartOffset(), afd.getLength());
                                afd.close();
                                mp2.prepare();
                                mp2.start();
                            }
                        }
                        catch (Exception ex) 
                        {
                           ex.printStackTrace();
                        }

                    } 
                    else if (mCompleted == myAudio.length) 
                    {
                        mCompleted =0;
                        try
                        {
                            AssetFileDescriptor afd = getResources().openRawResourceFd(myAudio[mCompleted]);
                            if (afd != null) 
                            {
                                mp2.setDataSource(afd.getFileDescriptor(), afd.getStartOffset(), afd.getLength());
                                afd.close();
                                mp2.prepare();
                                mp2.start();
                            }
                        }
                        catch (Exception ex) 
                        {
                           ex.printStackTrace();
                        }
                    }
                    else
                    {
                        mCompleted=0;
                         mp2.release();
                         mp2 = null;
                    }

                }
            });


            mp2.start();  

        }

    });

4 个答案:

答案 0 :(得分:0)

尝试覆盖onbackpressed方法

@Override
    public void onBackPressed()
    {
         // code here to stop and finish()
         super.onBackPressed();  
    }

答案 1 :(得分:0)

我认为它是一个音频缓冲区问题,内存加载到音频缓冲区并在以后持续存在,finish()可能无法帮助你。 当你按下Android按钮上的后退按钮时,它只是调用finish()来进行当前活动,而当你按下home按钮时它会调用onPause(), 你需要覆盖onBackPressed()方法,并在行super.onbackPressed()之前; 让你的代码停止播放。 当你去TakMgr它只是得到PID引用你的应用程序进程并杀死进程。 这就像System.exit(0);或android.os.process.kill(getMyPid()); 这简直就是你不想要的应用程序。

答案 2 :(得分:0)

你可以在onPause()中暂停你的mp并在onResume()中重启吗? 也许你还希望存储在savedInstance中,此时你就是这样!

希望它有用

答案 3 :(得分:0)

当你回来按活动时,只需停止媒体播放器并释放资源并完成活动即可。*

@Override
    public void onBackPressed()
    {
         btnStop.performClick();
         super.onBackPressed();  
    }