Android的onBackPressed()方法如何在未明确在MainActivity中调用的情况下调用?

问题描述:

onBackPressed()方法被调用时,我不得不在onCreate()方法内写入onBackPressed();。我知道这个方法是有效的,因为当我注释掉它的时候,它的效果就被删除了(即,即使其他活动被调用,也会从MainActivity中退出程序)。Android的onBackPressed()方法如何在未明确在MainActivity中调用的情况下调用?

此外,如果我输入onBackPressed();到MainActivity中,那么它将无法工作。我真的很困惑,为什么onBackPressed()方法没有我必须调用该方法。对不起,如果我没有正确地说出问题,我希望我做到了!并提前致谢!

public class MainActivity extends ActionBarActivity{ 

private Button button; 
private Button button2; 
private ImageView im; 
private ImageView im2; 
private boolean doubleBackToExitPressedOnce = false; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    this.requestWindowFeature(Window.FEATURE_NO_TITLE); 
    setContentView(R.layout.activity_main); 

} 
@Override 
public void onBackPressed(){ 
    Intent intent = new Intent(Intent.ACTION_MAIN); 
    intent.addCategory(Intent.CATEGORY_HOME); 
    intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
    startActivity(intent); 
} 

public void changeColor() { 
    button = (Button) findViewById(R.id.button); 
    im = (ImageView) findViewById(R.id.imageView2); 

    button.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View view) { 
      im.setBackgroundColor(Color.rgb(255,255,255)); 
     } 
    }); 
    } 
} 
+0

onBackPressed被称为当用户按下后面的键。这个调用是由框架完成的。 '我知道这个方法有效,因为当我将它注释掉时,它的效果就被删除了(即,即使其他活动被调用,也会从MainActivity中退出程序)。另外,如果我输入onBackPressed();进入MainActivity,那么它将无法工作“完全不清楚。 – Kishore

+0

提供的所有答案都非常有意义。感谢你们!!! –

看到上面的方法声明的小注释@Override?这是一种方便的方式来跟踪从超类继承10的方法。这意味着MainActivity的超类Activity也有一个名为OnBackPressed()的方法。

现在,根据面向对象的编程设计,行为和所共有所有活动,在Activity类被实现为(或至少所定义的)的属性。由于您可以在任何活动中按下后退按钮,因此该方法是抽象为Activity类。 Android操作系统会为您调用此方法,因此每次按下后退按钮时都不必亲自操作。这不是很好吗?所以基本上,你可以有两个类从Activity继承onBackPressed(),但让他们执行不同的代码。这被称为polymorphism

有关继承的更多信息here

调用onBackPressed()方法时,我不必编写onBackPressed();在onCreate()方法中。

第一部分...

From the docs

活动时已检测到用户的返回键的按下调用。默认实现只是完成当前活动,但您可以覆盖它以执行任何您想要的操作。

所以这是简版“为什么”它仍然运行,当你不实现它自己。

第二部分... 我不知道为什么你会永远把它在onCreate()

另外,如果我输入onBackPressed();进入MainActivity,那么它将无法工作。

这将工作如何编程它的工作。

您有...

@Override 
public void onBackPressed(){ 
    Intent intent = new Intent(Intent.ACTION_MAIN); 
    intent.addCategory(Intent.CATEGORY_HOME); 
    intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
    startActivity(intent); 
} 

这样你就不会调用它的super方法这就是为什么它不打烊如你所愿。

为了解决这个问题,调用该方法

@Override 
public void onBackPressed(){ 
    Intent intent = new Intent(Intent.ACTION_MAIN); 
    intent.addCategory(Intent.CATEGORY_HOME); 
    intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
    startActivity(intent); 
    super.onBackPressed(); // add this here 

} 

Some further Java reading

一个简单而直接的答案:

阅读下面这行说

public class MainActivity extends ActionBarActivity{

你主活动延伸法ionBarActivity。

每当一个类扩展另一个类时,它会继承父类的所有内容(在这种情况下,ActionBarActivity就是您的父类)。

如果按下控件并单击ActionBarActivity,它将带您进入该类,您可以看到其中实现的方法。如果继续向上,您会发现onBackPressed()在层次结构的某处实施。

因此,默认情况下,当您扩展活动时,活动类正在实施onBackPressed()。您可以通过重写它改变这个函数的行为,如:

@Override 
OnBackPressed() {...} 

要了解更多关于继承和压倒一切的,我建议你把这个读:

https://docs.oracle.com/javase/tutorial/java/IandI/subclasses.html