Java 有人能给我解释一下这个方法是如何工作的吗?

Java 有人能给我解释一下这个方法是如何工作的吗?,java,android,keylistener,Java,Android,Keylistener,我有一个应用程序,当你按下屏幕上的按钮时,它会播放mp3文件。我想让它,如果我按下后退按钮或主页按钮,而mp3正在播放,歌曲停止播放。我想做一个if语句,检查back/home按钮是否被按下,如果其中任何一个是真的,那么调用myMediaPlayer.stop() 到目前为止,我发现的唯一检查后退按钮是否按下的方法是: @Override public boolean onKeyDown(int keyCode, KeyEvent event) { if ((keyCode == Key

我有一个应用程序,当你按下屏幕上的按钮时,它会播放mp3文件。我想让它,如果我按下后退按钮或主页按钮,而mp3正在播放,歌曲停止播放。我想做一个if语句,检查back/home按钮是否被按下,如果其中任何一个是真的,那么调用myMediaPlayer.stop()

到目前为止,我发现的唯一检查后退按钮是否按下的方法是:

@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
    if ((keyCode == KeyEvent.KEYCODE_BACK)) {
        return true;
    }
    return super.onKeyDown(keyCode, event);
}
我的问题是,我不知道如何在if语句中调用onKeyDown并检查是否按下了back或home按钮

在哪里可以找到我需要传递给它的键码和事件

**以下是初始化和播放mp3文件的代码:

protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

final MediaPlayer mp = new MediaPlayer();
Button b = (Button) findViewById(R.id.default_activity_button);

b.setOnClickListener(new OnClickListener() {

    public void onClick(View v) {
        try {
            mp.reset();
            AssetFileDescriptor afd;
            afd = getAssets().openFd("sound.mp3");
            mp.setDataSource(afd.getFileDescriptor(), afd.getStartOffset(), afd.getLength());
            mp.prepare();
            mp.start();

        } catch (IllegalStateException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();enter code here
        }
    }

});
有没有办法做到这一点:

if(mp.isPlaying() == true && /* pseudo code*/BackButtonPressed == true/* pseudo code*/)
        {

        }
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
    if (((keyCode == KeyEvent.KEYCODE_BACK)||(keyCode == KeyEvent.KEYCODE_HOME))&&(mp.isPlaying())) {
        mp.stop();
    }
    return super.onKeyDown(keyCode, event);
}

当发生任何按键关闭事件时,操作系统会自动调用此函数。所以,你不需要自己明确地称呼它。您只需检查需要确定的按键。return语句告诉操作系统您是否自己处理了按键。如中所示,当您返回true时,操作系统知道您已成功处理该事件,并且它不需要对特定的按键执行任何操作

但是,检测后退键按下的更标准的方法是重写onBackPressed()

像这样的,

@Override
    public void onBackPressed() {
       //stop playing mp3
    }
在您的情况下,一个更具体的解决方案是,当您的活动进入暂停状态时,按下后退键或主页按钮,立即停止播放音乐

@Override
protected void onPause(){
        //stop playing mp3
        super.onPause();
    }

你说的是UI按钮还是键盘键
onKeyDown
用于捕捉键盘按键

若你们想捕捉按钮点击,你们需要注册一个点击监听器到你们的按钮

如果要捕获密钥,需要在视图中注册一个
OnKeyListener

如果要捕捉特殊的后退按钮,则覆盖活动的
onBackPressed()
方法就足够了。比如:

public void onBackPressed() {
  if (mp.isPlaying()) {
    // do want you want
    mp.stopPlaying();
  } else {
    // default behavior ?
    super.finish(); // dismiss the current activity
  }
}

应该可以工作。

onKeyDown
是安卓系统在按下设备上的按钮时自动调用的一种公共方法。您不需要直接调用它,但需要覆盖它。描述了系统传递给它的
KeyEvent
。它包含许多引用特定键的常量。我不在家测试这个,但我想你想要这样的东西:

if(mp.isPlaying() == true && /* pseudo code*/BackButtonPressed == true/* pseudo code*/)
        {

        }
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
    if (((keyCode == KeyEvent.KEYCODE_BACK)||(keyCode == KeyEvent.KEYCODE_HOME))&&(mp.isPlaying())) {
        mp.stop();
    }
    return super.onKeyDown(keyCode, event);
}

编辑:我还没有足够的代表直接评论@Swayam的解决方案,但我相信在
onPause
方法中实现您的解决方案也会在方向改变时停止音乐,这可能是不需要的。

您不需要这样做。您可以在
onPause()
中停止它,我已经将这两个方法都添加到了代码的底部,我应该在哪里调用这些方法?我应该从onCreate方法调用它们吗?当我调用onBackPressed时,活动屏幕关闭,而mp3继续播放。您不需要从任何地方调用它们。操作系统将自动调用这些函数。这些是回调,在活动生命周期中的特定事件发生时调用。您还需要编写代码以停止在onBackPressed中播放mp3。我已从主java文件中添加了代码,以向您确切显示我正在处理的内容。我应该把你说的方法叫到哪里去?我尝试过实现上面的示例,但似乎没有任何效果。我在代码的底部添加了@Swayam的解决方案,我应该在哪里调用这些方法?我应该从onCreate方法调用它们吗?当我按下call On Backpressed时,“活动”屏幕关闭,mp3继续播放。您的代码不应直接调用
onKeyDown
onPause
。当按下
onKeyDown
键或您的活动暂停
onPause
时,Android系统会为您调用它们。您可能想阅读我在主java文件中添加的Android活动生命周期代码,以向您展示我正在处理的内容。有什么帮助吗?我错过了你最后的评论。我已更新我的答案,以解决您最近的编辑问题。这种方法可以改变上一个问题的逻辑,因此,如果按下back键(自动调用onKeyDown),它会检查mp是否正在播放,如果正在播放,则会停止mp。我已经从主java文件中添加了代码,以向您确切显示我正在处理的内容。有什么帮助吗?我正试图让它在任何android设备上,如果你按下后退按钮(因为所有android手机都有后退按钮),那么音频,如果播放,就会停止播放。谢谢,我按下后退按钮停止播放音频。现在,home按钮也是这样吗?我会重写onHomePressed吗?不,你不应该试图修改Home按钮的行为,我认为你不能使用标准API。Home按钮是一种关键功能,因此您最好尝试其他功能。