onBackPressed杀死活动中的处理程序 - Android

时间:2012-07-02 18:48:59

标签: android handler android-activity

正如您所看到的,我有这个PlayLesson_01活动,它同时显示图像和音频。此活动有两个处理程序,一个用于控制图像和音频,另一个将完成课程并返回上一个活动(课程菜单)。

目标:点击“硬回”按钮返回上一个活动并停止播放图像和音频。

问题:当我点击“返回”时,我可以返回上一个活动,但音频仍在播放。我无法停止< / strong>或 kill 在活动中启动的处理程序。

问题:如何彻底杀死或停止这些处理程序?

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

}

}

2 个答案:

答案 0 :(得分:47)

现在代码中有一些错误的东西:

  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)

答案 1 :(得分:0)

您的处理程序不是&#34;正在运行&#34;,您的媒体播放器是。只需在mp.stop()中拨打onBackPressed()

此外,Arun George说的话。