Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/212.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 活动中onBackPressed()的默认实现是什么_Android_Android Activity_Android Lifecycle_Kill Process_Onbackpressed - Fatal编程技术网

Android 活动中onBackPressed()的默认实现是什么

Android 活动中onBackPressed()的默认实现是什么,android,android-activity,android-lifecycle,kill-process,onbackpressed,Android,Android Activity,Android Lifecycle,Kill Process,Onbackpressed,我想知道活动中onBackPressed()的默认实现。如何在onBackPressed()的默认实现中处理活动恢复 以下是我所面临的问题。我有一个测试活动代码如下: public class MainActivity extends Activity { public static boolean test = false; @Override protected void onCreate(Bundle savedInstanceState) { su

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

以下是我所面临的问题。我有一个测试
活动
代码如下:

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”。然后我点击后退按钮,进入主屏幕。之后,当我进入应用程序时,我得到祝酒词“是真的”。我认为
onBackPressed()
应该会在我的应用程序返回主屏幕时终止它,但它不会。这是我的问题

如果我像这样重写
onBackPressed()

@Override
public void onBackPressed() {
//  super.onBackPressed();
    finish();
    try {
        android.os.Process.killProcess(android.os.Process.myPid());
    } catch (Exception e) {
        e.printStackTrace();
    }
}
我总是在进入应用程序后得到“is false”的祝酒词

谁能解释一下这个问题并告诉我
onBackPressed()的默认实现是什么

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


提前感谢。

从AOSP
活动中找到:

因此,基本上,当您调用finish时,进程实际上并没有被破坏。你可以阅读更多关于这方面的内容。这意味着应用程序中的内存不会被破坏,因此当你重新启动应用程序时,会记住以前的
布尔值


在您被覆盖的实现中,您正在显式销毁进程,这将清除活动状态的内存,因此当您重新启动应用程序时,
布尔值
初始化将再次发生。

活动
的默认实现可能不会告诉您很多关于实际的
活动
/应用程序生命周期的信息。您应该深入了解内部
Android
(和
Linux
)关于应用程序/进程杀戮的“机制”

应用程序开发人员应该知道的是,一旦
活动
处于后台(按下主页按钮,收到来电等,即
onPause()
后接
onStop()
被调用),其进程可能(类似于您使用
android.os.process.killProcess(…)
)或者可能不会被杀。请参见Dianne Hackborn的参考资料

至于通过按下后退按钮来完成
活动
,这并不意味着它的实例将立即被杀死,内存垃圾将被收集(请参阅)。这只意味着下次导航回
活动时,将创建该活动的新实例

关于你的代码和声明

当我第一次进入应用程序时,我得到“is false”。然后我点击后退按钮,进入主屏幕。之后,当我进入应用程序时,我得到祝酒词“是真的”。我认为onBackPressed()应该在我的应用程序返回主屏幕时终止它,但事实并非如此

活动
处于后台时,系统没有终止进程就是这种情况(同样,也不能保证)。如果是这样的话,
Toast
将显示
false

为了检查每次按下“后退”按钮并导航回应用程序时是否创建了
MainActivity
的新实例,我不建议使用静态变量,-它看起来不太明显(例如,请参见或)

此外,您只是在
true
false
之间切换,这可能会让人困惑。例如,您可以使用一个非静态变量来递增它,而不是使用静态变量,或者toast当前
活动
实例的哈希代码,例如
toast.makeText(this,“is”+this.hashCode(),toast.LENGTH\u LONG).show()
。通过执行此操作,
活动
生命周期应按照

如果我重写onBackPressed()。。。我总是在进入应用程序后得到“is false”的祝酒词


这或多或少类似于系统终止应用程序进程时的情况。

似乎一切正常。您破坏了您的进程并
false
字段“清除”。那么问题出在哪里呢?没有。我只需单击“后退”菜单按钮。在我返回主屏幕之后,我再次进入该应用程序,但测试变为真实。这意味着,默认的onBackPressed不会破坏我的进程。默认的
onBackPressed
不会破坏你的进程。它会销毁您的
活动
和所有与活动相关的对象(片段、ui)。@Foxinsocks销毁我的活动,不回收MainActivity.class?您说的
不回收
是什么意思<如果你是这个意思的话,你的活动的code>ClassLoader
不会卸载
class
。你能详细描述一下onBackPressed的所有过程吗?谢谢事实上,我读过popbackimmediate()源代码。我无法描述Android在后台的操作。考虑一下这个简单的例子:你正在使用Android手机,在主屏幕上。此时只有1个片段打开(主屏幕)。这意味着片段堆栈上没有片段。现在,考虑打开一个浏览器。浏览器打开,现在打开了一个新片段。主屏幕片段现在放在堆栈上,因此堆栈上有1个项目。现在再考虑使用后退按钮。Android将检查堆栈中是否有片段。由于存在1,它将关闭当前片段并恢复堆栈上的片段。我希望这是有帮助的。谢谢。顺便说一句,
onBackPressed
调用
onDestory
?不是直接调用。隐式调用
onBackPressed()
会导致系统调用
onDestroy()
。隐式调用是什么意思?我试过按一下
。应用程序直接返回主屏幕,而不是登录onDestroy。当内存不足时,系统可能不会调用
onDestroy()
,但不会
/**
 * 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();
    }
}