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.
- ¿Cómo utilizar los controladores?
- ¿Cómo abrir la última actividad de la barra de estado de la notificación?
- ¿Cómo puedo iniciar la aplicación en la actividad principal?
- Android - Problemas para iniciar la actividad correcta?
- Android - Detener AsyncTask cuando se pulsa el botón Atrás y volver a Actividad anterior
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 }
}
- Cómo devolver un resultado a través de múltiples actividades
- Snackbar no funciona dentro de la clase de fragmento
- ¿Cómo haces que un acceso directo de "Inicio" de Android evite la aplicación?
- La actividad principal no es la basura recogida después de la destrucción porque es referenciada por InputMethodManager indirectamente
- Android: ¿cómo puedo abrir otra aplicación de mi aplicación?
- Actividad de inicio de Android en la selección del elemento de menú
- Actualización del fragmento de la actividad mediante Rxjava Android
- Android: Modo de inicio 'instancia única'
Ahora hay un par de cosas malas en su código:
-
Si desea volver a su actividad anterior, no lo vuelve a
startActivity
usando unastartActivity
como el comportamiento predeterminado de android es que mantiene una pila de actividades anteriores. Al presionar deback
, volverá por defecto a la actividad anterior (a menos que haya iniciado la actividad infantil usando algunos indicadores). -
¿Por qué está utilizando un
System.exit(0);
En la prensa posterior? Sólo tienes que llamar alfinish()
para terminar la actividad actual. -
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.