Activity 中 onBackPressed() 的默认实现是什么
What is the default implementation of onBackPressed() in Activity
我想知道 Activity
中 onBackPressed()
的默认实现。如何处理 onBackPressed()
默认实现中的 Activity
恢复?
以下是我遇到的问题。我有一个这样的测试 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;
}
}
当我第一次进入应用程序时,我得到 'is false'。然后我单击后退按钮并进入主屏幕。之后,当我进入应用程序时,我得到了 Toast 'is true'。我认为 onBackPressed()
在返回主屏幕时应该终止我的应用程序,但事实并非如此。这是我的问题。
如果我像这样覆盖 onBackPressed()
@Override
public void onBackPressed() {
// super.onBackPressed();
finish();
try {
android.os.Process.killProcess(android.os.Process.myPid());
} catch (Exception e) {
e.printStackTrace();
}
}
我总是在进入应用程序后得到 Toast'is false'。
任何人都可以解释这个问题并告诉我 onBackPressed()
的默认实现是什么吗?
我想详细了解onBackPressed()
中的流程。看了onBackPressed()
上的一些源码,但是没看懂
提前致谢。
从 AOSP Activity
class 找到 here:
/**
* 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
值会被记住。
在重写实现的情况下,您明确销毁了进程,这将清除您的 activity 状态的内存,因此当您重新启动应用程序时,boolean
初始化将再次发生.
Activity
的 onBackPressed()
的默认实现可能不会告诉您很多关于实际 Activity
/应用程序生命周期的信息。你应该挖多少北斗来了解内部Android
(和Linux
)"mechanics"对application/process的杀戮。
应用程序开发人员应该知道的是,一旦 Activity
在后台(按下主页按钮、收到来电等,即 onPause()
后跟 onStop()
已被调用) 它的进程可能(类似于你对 android.os.Process.killProcess(...)
所做的)也可能不会被杀死。请参阅 Dianne Hackborn 的 Multitasking the Android Way 以供参考。
至于通过按后退按钮完成 Activity
,并不意味着它的实例将立即被杀死并收集内存垃圾(参见 this answer)。这只是意味着 Activity
的新实例将在您下次导航回它时创建。
关于您的代码和
When I first enter the app, I get 'is false'. Then I click back button and get to the home screen. After that, when I enter the app, I get the Toast 'is true'. I think the onBackPressed() should kill my app when it gets back to the home screen, but It does not.
这是当 Activity
处于后台时系统没有终止进程的情况(同样,不能保证)。如果是这样,Toast
会显示 false
.
为了检查每次按下后退按钮然后导航回应用程序时是否创建了 MainActivity
的新实例,我不建议使用静态变量,- 它出现不是那么明显(例如,参见 is it possible for Android VM to garbage collect static variables... or Are static fields open for garbage collection?)。
此外,您只是在 true
和 false
之间切换,这可能会造成混淆。例如,您可以使用 non-static 递增它而不是使用静态变量,或者 toast 当前 Activity
实例的哈希码,如 Toast.makeText(this,"is " + this.hashCode(), Toast.LENGTH_LONG).show()
。通过这样做,Activity
生命周期应该按照 documentation.
If I override onBackPressed() ... I always get the Toast 'is false' after I enter the app.
这或多或少类似于系统终止您的应用进程时的情况。
我想知道 Activity
中 onBackPressed()
的默认实现。如何处理 onBackPressed()
默认实现中的 Activity
恢复?
以下是我遇到的问题。我有一个这样的测试 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;
}
}
当我第一次进入应用程序时,我得到 'is false'。然后我单击后退按钮并进入主屏幕。之后,当我进入应用程序时,我得到了 Toast 'is true'。我认为 onBackPressed()
在返回主屏幕时应该终止我的应用程序,但事实并非如此。这是我的问题。
如果我像这样覆盖 onBackPressed()
@Override
public void onBackPressed() {
// super.onBackPressed();
finish();
try {
android.os.Process.killProcess(android.os.Process.myPid());
} catch (Exception e) {
e.printStackTrace();
}
}
我总是在进入应用程序后得到 Toast'is false'。
任何人都可以解释这个问题并告诉我 onBackPressed()
的默认实现是什么吗?
我想详细了解onBackPressed()
中的流程。看了onBackPressed()
上的一些源码,但是没看懂
提前致谢。
从 AOSP Activity
class 找到 here:
/**
* 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
值会被记住。
在重写实现的情况下,您明确销毁了进程,这将清除您的 activity 状态的内存,因此当您重新启动应用程序时,boolean
初始化将再次发生.
Activity
的 onBackPressed()
的默认实现可能不会告诉您很多关于实际 Activity
/应用程序生命周期的信息。你应该挖多少北斗来了解内部Android
(和Linux
)"mechanics"对application/process的杀戮。
应用程序开发人员应该知道的是,一旦 Activity
在后台(按下主页按钮、收到来电等,即 onPause()
后跟 onStop()
已被调用) 它的进程可能(类似于你对 android.os.Process.killProcess(...)
所做的)也可能不会被杀死。请参阅 Dianne Hackborn 的 Multitasking the Android Way 以供参考。
至于通过按后退按钮完成 Activity
,并不意味着它的实例将立即被杀死并收集内存垃圾(参见 this answer)。这只是意味着 Activity
的新实例将在您下次导航回它时创建。
关于您的代码和
When I first enter the app, I get 'is false'. Then I click back button and get to the home screen. After that, when I enter the app, I get the Toast 'is true'. I think the onBackPressed() should kill my app when it gets back to the home screen, but It does not.
这是当 Activity
处于后台时系统没有终止进程的情况(同样,不能保证)。如果是这样,Toast
会显示 false
.
为了检查每次按下后退按钮然后导航回应用程序时是否创建了 MainActivity
的新实例,我不建议使用静态变量,- 它出现不是那么明显(例如,参见 is it possible for Android VM to garbage collect static variables... or Are static fields open for garbage collection?)。
此外,您只是在 true
和 false
之间切换,这可能会造成混淆。例如,您可以使用 non-static 递增它而不是使用静态变量,或者 toast 当前 Activity
实例的哈希码,如 Toast.makeText(this,"is " + this.hashCode(), Toast.LENGTH_LONG).show()
。通过这样做,Activity
生命周期应该按照 documentation.
If I override onBackPressed() ... I always get the Toast 'is false' after I enter the app.
这或多或少类似于系统终止您的应用进程时的情况。