OnBackPressed para matar a un manejador dentro de una actividad – Android

Como puedes ver, tengo esta actividad de PlayLesson_01 que muestra imágenes y audio al mismo tiempo. Esta actividad cuenta con dos controladores, uno para controlar imágenes y audio, mientras que el otro terminará la lección y volverá a la actividad anterior (Menú de Lecciones).

Objetivo : Haga clic en el botón Atrás para volver a la actividad anterior y dejar de reproducir imágenes y audio.

Problema : Cuando hago clic en "Back" duro puedo volver a la actividad anterior, pero el audio todavía está jugando. No soy capaz de detener o matar el controlador que se inició dentro de la actividad.

Pregunta : ¿Cómo puedo matar o detener a esos manejadores por completo?

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 } 

}

Ahora hay un par de cosas malas en su código:

  1. Si desea volver a su actividad anterior, no lo vuelve a startActivity usando una startActivity como el comportamiento predeterminado de android es que mantiene una pila de actividades anteriores. Al presionar de back , volverá por defecto a la actividad anterior (a menos que haya iniciado la actividad infantil usando algunos indicadores).

  2. ¿Por qué está utilizando un System.exit(0); En la prensa posterior? Sólo tienes que llamar al finish() para terminar la actividad actual.

  3. La mejor manera de eliminar devoluciones de llamada de un controlador utiliza un null como parámetro. Puede probar el código siguiente:

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

    Ya que esto eliminaría todas las devoluciones de llamada. Consulta este enlace para obtener más información: http://developer.android.com/reference/android/os/Handler.html#removeCallbacksAndMessages(java.lang.Object)

Su Handler no está "corriendo", su reproductor de medios es. Sólo mp.stop() llamar a mp.stop() en onBackPressed() .

También, lo que dijo Arun George.

  • Cómo controlar la pila trasera de Android
  • Aplicación con 2 actividades de lanzamiento
  • ¿Por qué "onPause" no se llama en la siguiente situación?
  • Cómo enviar cadena de una actividad a otra?
  • El servicio se crea de nuevo después de onTaskRemoved
  • ¿Qué podría estar causando este SQLite CursorWindowAllocationException?
  • Android - startActivityForResult fuera de una actividad?
  • ¿Cómo dar párrafos en una actividad?
  • Android weakReference to Activity se anula mientras se está ejecutando la actividad
  • Android cómo crear mi propia actividad y ampliarla?
  • Múltiples instancias de actividad y FLAG_ACTIVITY_REORDER_TO_FRONT
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.