Search code examples
androidback-button

Handling Android hardware Back button


I have an onKeyDown event which is only needed for handling the Up and Down hardware keys in my app. For these it returns true, as they are handled. For anything else it returns false which I understand means that the OS should handle them. However, when I press the Back button, my onKeyDown is called and returns false, but there is no other effect. I want/would expect the OS to finish the current Activity and resume the previous one.

Is this correct behavior, or is there something amis?

Update:

Cheers guys, my onKeyDown routine looks like this, now I've followed CommonsWare's advice:

@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
    super.onKeyDown(keyCode, event);

    boolean handled = true;

    // handle key presses
    switch (keyCode) {

    case KeyEvent.KEYCODE_DPAD_LEFT:
        mCursorX = mCursorX - 1;
        if (mCursorX < MAP_MIN_X) { mCursorX = MAP_MIN_X; }
        break;

    case KeyEvent.KEYCODE_DPAD_RIGHT:
        mCursorX = mCursorX + 1;
        if (mCursorX > MAP_MAX_X) { mCursorX = MAP_MAX_X; }
        break;

    default:
        handled = false;

    if (handled) {
        redrawCursorno();
        return true;
    }

    return super.onKeyDown(keyCode,event);
}

My class looks like:

public class Map extends Activity implements OnClickListener, SurfaceHolder.Callback, OnTouchListener {

I must admit I didn't know why the @override and the first 'super' line were there, they were just in all the routines I looked at. If the super.onKeyDown runs the onKeyDown for the Activity, then I probably don't want it at the start, only at the end if my routine doesn't handle it, which I think is what I've added. Does that sound about right, or am I still confused?

-Frink


Solution

  • I would recommend chaining to the superclass. In other words, instead of:

    return(false);
    

    do:

    return(super.onKeyDown(...));