Activity

时间:2016-01-22 15:12:20

标签: android android-activity android-lifecycle kill-process onbackpressed

我想知道onBackPressed()Activity的默认实现。如何在Activity的默认实现中处理onBackPressed()恢复?

以下是我遇到的问题。我有一个像这样的测试Activity代码:

public class MainActivity extends Activity {
    public static boolean test = false;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }

    @Override
    protected void onResume() {
        super.onResume();
        Toast.makeText(this,"is "+test,Toast.LENGTH_LONG).show();
        test = !test;
    }
}

当我第一次进入应用程序时,我得到'是假的'。然后我点击后退按钮进入主屏幕。在那之后,当我进入应用程序时,我得到Toast'是真的'。我认为onBackPressed()应该会在我的应用程序返回到主屏幕时终止它,但事实并非如此。这是我的问题。

如果我像这样覆盖onBackPressed()

@Override
public void onBackPressed() {
//  super.onBackPressed();
    finish();
    try {
        android.os.Process.killProcess(android.os.Process.myPid());
    } catch (Exception e) {
        e.printStackTrace();
    }
}

进入应用程序后,我总是得到Toast''false'。

任何人都可以解释这个问题并告诉我onBackPressed()的默认实现是什么?

我想详细了解onBackPressed()中的流程。我已经阅读了onBackPressed()上的一些源代码,但我无法理解它。

提前致谢。

2 个答案:

答案 0 :(得分:1)

发现here的AOSP Activity课程:

/**
 * Called when the activity has detected the user's press of the back
 * key.  The default implementation simply finishes the current activity,
 * but you can override this to do whatever you want.
 */
public void onBackPressed() {
    if (mActionBar != null && mActionBar.collapseActionView()) {
        return;
    }

    if (!mFragments.getFragmentManager().popBackStackImmediate()) {
        finishAfterTransition();
    }
}

所以基本上当你调用完成时,这个过程实际上并没有被破坏。您可以阅读有关here的更多信息。这意味着应用程序中的内存不会被破坏,因此当您重新启动应用程序时,会记住之前的boolean值。

如果被覆盖的实现,您将明确销毁该进程,这将清除您的活动状态的内存,因此当您重新启动应用程序时,boolean初始化将再次发生。

答案 1 :(得分:1)

Activity' onBackPressed()的默认实现可能不会告诉您很多关于实际Activity /应用程序生命周期的信息。你应该挖掘北斗,以了解内部Android(和Linux)"机制"关于申请/流程杀人。

应用程序开发人员应该知道的是,一旦Activity处于后台(按下主页按钮,收到来电等,即onPause()后跟onStop()已被调用)过程可能(类似于你对android.os.Process.killProcess(...)所做的)或者可能不会被杀死。请参阅Dianne Hackborn的Multitasking the Android Way作为参考。

关于通过按后退按钮完成Activity,并不意味着它的实例将被立即杀死并收集内存垃圾(参见this answer)。它只是意味着下次导航回来时会创建Activity的新实例。

关于您的代码和

的陈述
  

当我第一次进入应用程序时,我得到的是“错误”。然后我点击后退按钮进入主屏幕。在那之后,当我进入应用程序时,我得到Toast'是真的'。我认为onBackPressed()应该在它回到主屏幕时杀死我的应用程序,但事实并非如此。

Activity处于后台时系统没有终止进程(再次,无法保证),就是这种情况。如果是,则Toast会显示false

为了检查每次按下后退按钮然后导航回应用程序时是否创建了MainActivity的新实例,我建议不要使用静态变量, - 它会出现不那么明显(例如,参见is it possible for Android VM to garbage collect static variables...Are static fields open for garbage collection?)。

除此之外,您只需在truefalse之间切换,这可能会造成混淆。例如,您可以使用非静态变量来代替使用静态变量,或者使用当前Activity实例的哈希码来烘烤,例如Toast.makeText(this,"is " + this.hashCode(), Toast.LENGTH_LONG).show()。通过执行此操作,Activity生命周期应按照documentation行事。

  

如果我覆盖onBackPressed()......我总是得到Toast'是假的'在我进入应用程序之后。

这或多或少类似于系统杀死你应用程序的过程。