簡體   English   中英

如何銷毀活動?

[英]How do I destroy an activity?

我有一個全循環按鈕和一個停止按鈕。 當我仍在頁面上時,兩個按鈕都可以正常工作。 問題是,當我按下“全部循環”按鈕時,它會按預期播放一系列音頻文件,但是當我離開頁面(即按下電話的“后退”按鈕)並返回頁面時,音頻不會別停! 我按下了停止按鈕,但是它什么也沒做。 停止它的唯一方法是進入任務管理器並結束程序。 在我看來,一旦離開頁面,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();  

        }

    });

嘗試覆蓋onbackpressed方法

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

我認為這是一個音頻緩沖區問題,內存已加載到音頻緩沖區中,並在以后持續存在,finish()可能對您沒有幫助。 當您在android按鈕上按下后退按鈕時,它僅調用當前活動的finish(),而當您按下主屏幕按鈕時則調用onPause(),則需要重寫onBackPressed()方法,並且在super.onbackPressed()行之前。 將您的代碼停止播放。 當您轉到TakMgr時,只需獲取與您的App進程相關的PID,然后終止該進程即可。 就像System.exit(0); 或android.os.process.kill(getMyPid()); 只是結束了您不想要的應用程序。

您可以在onPause()中暫停mp,然后在onResume()中重新啟動它嗎?
也許您還想將您當時存儲在saveInstance中!

希望對您有所幫助

當您向后按下活動時,只需停止媒體播放器並釋放資源即可完成活動。就是這樣!

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM