2012-07-02 123 views
8

正如你所看到的,我有這個PlayLesson_01活動,它同時顯示圖像和音頻。此活動有兩個處理程序,一個用於控制圖像和音頻,另一個則完成課程並返回上一個活動(課程菜單)。onBackPressed在一個活動中殺死一個處理程序 - Android

目標:單擊硬返回按鈕返回上一個活動並停止播放圖像和音頻。

問題:當我點擊硬「後退」我能回到以前的活動,但聲音仍然playing.I'm不能停止處理程序在活動內發起。

問題:我該如何殺死或完全停止這些處理程序?

import android.app.Activity; 
import android.content.Context; 
import android.content.Intent; 
import android.media.MediaPlayer; 
import android.media.MediaPlayer.OnCompletionListener; 
import android.os.Bundle; 
import android.os.Handler; 
import android.os.Looper; 
import android.view.View; 
import android.view.ViewGroup; 
import android.view.Window; 
import android.view.animation.AnimationUtils; 
import android.widget.AdapterView; 
import android.widget.AdapterView.OnItemSelectedListener; 
import android.widget.BaseAdapter; 
import android.widget.Gallery; 
import android.widget.ImageSwitcher; 
import android.widget.ImageView; 
import android.widget.RelativeLayout.LayoutParams; 
import android.widget.ViewSwitcher.ViewFactory; 

public class PlayLesson_01 extends Activity implements OnItemSelectedListener, 
    ViewFactory, Runnable { 

// Setting up images 
// Keeping all Images in array references to our images 
public Integer[] mThumbIds = { R.drawable.nouraniyah, 
     R.drawable.back_angle, R.drawable.back_fox, R.drawable.back_apple, 
     R.drawable.back_twitter, R.drawable.back_thunderbird }; 
// setting up music 
int[] myMusic = { R.raw.button_3, R.raw.button_3, R.raw.button_3, 
     R.raw.button_3, R.raw.button_3, R.raw.button_3 }; 
int mNext; 
private ImageSwitcher mSwitcher; 
MediaPlayer mp; 
Handler mHandlerWholeLesson = new Handler(); 
Runnable mRunnableWholelesson = new Runnable() { 

    @Override 
    public void run() { 
     // TODO Auto-generated method stub 
     startActivity(new Intent("com.example.AmazingGame.LESSONONE")); 
    } 
}; 

Handler mHandlerNextfile = new Handler(); 
Runnable mRunnableNextFile = new Runnable() { 

    @Override 
    public void run() { 
     // TODO Auto-generated method stub 
     mp.setOnCompletionListener(mListener); 
     mp.start(); 
    } 

}; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    // TODO Auto-generated method stub 
    super.onCreate(savedInstanceState); 
    requestWindowFeature(Window.FEATURE_NO_TITLE); 
    setContentView(R.layout.image_switcher); // it could be lesson one 
               // layout. 

    mSwitcher = (ImageSwitcher) findViewById(R.id.imgswitcher); 
    mSwitcher.setFactory(this); 
    mSwitcher.setInAnimation(AnimationUtils.loadAnimation(this, 
      android.R.anim.fade_in)); 
    mSwitcher.setOutAnimation(AnimationUtils.loadAnimation(this, 
      android.R.anim.fade_out)); 

    Gallery g = (Gallery) findViewById(R.id.gallery); 
    g.setAdapter(new ImageAdapter(this)); 
    g.setOnItemSelectedListener(this); 
    // usual onCreate stuff here, then... 
    // either here or whenever you want to start the sequence 
    mNext = 0; 
    startNextFile(); 

    // Is this good !! Yes it is. count the time for all audio. 
    mHandlerWholeLesson.postDelayed(mRunnableWholelesson, 25000); 

} 

@Override 
public void onBackPressed() { 
    super.onBackPressed(); 
    startActivity(new Intent("com.example.AmazingGame.LESSONONE")); 
    System.exit(0); 
    mHandlerNextfile 
      .removeCallbacks(mRunnableNextFile, PlayLesson_01.class); 
    mHandlerWholeLesson.removeCallbacks(mRunnableWholelesson, 
      PlayLesson_01.class); 

    PlayLesson_01.this.finish(); 
} 

@Override 
protected void onDestroy() { 
    // TODO Auto-generated method stub 
    super.onDestroy(); 
    // mHandlerNextFile.removeCallbacksAndMesssages(PlayLesson_01.class); 
} 

public void onItemSelected(AdapterView<?> parent, View v, 
     final int position, long id) { 

} 

@Override 
public void onNothingSelected(AdapterView<?> arg0) { 
    // TODO Auto-generated method stub 

} 

@Override 
public View makeView() { 
    ImageView i = new ImageView(this); 
    i.setBackgroundColor(0xFF000000); 
    i.setScaleType(ImageView.ScaleType.FIT_CENTER); 
    i.setLayoutParams(new ImageSwitcher.LayoutParams(
      LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT)); 
    return i; 
} 

public class ImageAdapter extends BaseAdapter { 
    public ImageAdapter(Context c) { 
     mContext = c; 
    } 

    public int getCount() { 
     return mThumbIds.length; 
    } 

    public Object getItem(int position) { 
     return position; 
    } 

    public long getItemId(int position) { 
     return position; 
    } 

    public View getView(int position, View convertView, ViewGroup parent) { 
     ImageView i = new ImageView(mContext); 

     i.setImageResource(mThumbIds[position]); 
     i.setAdjustViewBounds(true); 
     i.setLayoutParams(new Gallery.LayoutParams(
       LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT)); 
     i.setBackgroundResource(R.drawable.picture_frame); 
     return i; 
    } 

    private Context mContext; 

} 

OnCompletionListener mListener = new OnCompletionListener() { 

    @Override 
    public void onCompletion(MediaPlayer mp) { 
     mp.release(); 
     startNextFile(); 
    } 
}; 

@Override 
protected void onPause() { 
    // TODO Auto-generated method stub 
    super.onPause(); 
    this.finish(); 

} 

public void startNextFile() { 

    if (mNext < myMusic.length) { 

     mp = MediaPlayer.create(this, myMusic[mNext]); 
     mSwitcher.setImageResource(mThumbIds[mNext++]); 
     mHandlerNextfile.postDelayed(mRunnableNextFile, 3000); 
    } 

} 

@Override 
public void run() { 
    // TODO Auto-generated method stub 

} 

}

回答

42

現在有幾個在你的代碼錯誤的東西:

  1. 如果你想回到你以前的活動,你不把它用startActivity作爲重啓android的默認行爲是它維護一堆以前的活動。在按back它將默認回到以前的活動(除非您已經使用某些標誌啓動了子活動)。

  2. 爲什麼在背壓時使用System.exit(0);?您只需致電finish()即可完成當前活動。

  3. 從處理程序中刪除回調的最佳方法是使用null作爲參數。您可以嘗試以下代碼:

    mHandlerNextfile.removeCallbacksAndMessages(null); 
    mHandlerWholeLesson.removeCallbacksAndMessages(null); 
    

    因爲這會刪除所有回調。檢查此鏈接瞭解更多:http://developer.android.com/reference/android/os/Handler.html#removeCallbacksAndMessages(java.lang.Object)

+0

謝謝。我現在工作。我將這兩個處理程序參數都更改爲「null」。我拿出System.exit(0)。 – Jawwalcom

+0

handler.removeCallbacksAndMessages(null);移除所有處理程序非常棒。 –

+0

重寫onDestroy()方法並調用mp.release()停止播放。 – SHB

0

您的處理器不是「跑」,你的媒體播放器。請致電onBackPressed()致電mp.stop()

此外,什麼阿倫喬治說。

+0

在** onBackPressed **中添加** mp.stop()**不起作用。它引發MediaPalyer錯誤(-38,0)。 – Jawwalcom

+0

有一些變化。它確實有效。我在** OnBackPressed ** – Jawwalcom

+0

中添加了** mp.stop()**它將是mp.release() – SHB