我想知道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()
上的一些源代码,但我无法理解它。
提前致谢。
答案 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?)。
除此之外,您只需在true
和false
之间切换,这可能会造成混淆。例如,您可以使用非静态变量来代替使用静态变量,或者使用当前Activity
实例的哈希码来烘烤,例如Toast.makeText(this,"is " + this.hashCode(), Toast.LENGTH_LONG).show()
。通过执行此操作,Activity
生命周期应按照documentation行事。
如果我覆盖onBackPressed()......我总是得到Toast'是假的'在我进入应用程序之后。
这或多或少类似于系统杀死你应用程序的过程。