onPause 方法没有被调用

Posted

技术标签:

【中文标题】onPause 方法没有被调用【英文标题】:onPause method is not being called 【发布时间】:2014-06-02 16:40:00 【问题描述】:

我是 android 开发新手,现在我正在尝试了解 android 活动的生命周期。

我有这些方法可以在logcat上打印出生命周期过程:

public void onCreate(Bundle savedInstanceState) 
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    Log.d(tag, "In the onCreate() event");


public void onStart() 
    super.onStart();
    Log.d(tag, "In the onStart() event");


public void onRestart() 
    super.onRestart();
    Log.d(tag, "In the onRestart() event");


public void onResume() 
    super.onResume();
    Log.d(tag, "In the onResume() event");


public void onStop() 
    super.onStop();
    Log.d(tag, "In the onStop() event");


public void onDestroy() 
    super.onDestroy();
    Log.d(tag, "In the onDestroy() event");

问题是永远不会调用 onPause()。我尝试按主页按钮,从最近的应用程序列表中选择其他应用程序,关闭屏幕显示,但它只是直接调用 onStop() 而不是调用 onPause() 然后调用 onStop()。我正在阅读的书说,如果将活动推入后台,则支持 onPause() 后跟 onStop()。

书籍内容:

Click the Phone button on the Android emulator so that the activity is pushed to the background. 
Observe the output in the LogCat window:
11-16 06:32:00.585: D/Lifecycle(559): In the onPause() event
11-16 06:32:05.015: D/Lifecycle(559): In the onStop() event

我正在运行 4.2.2 的真实设备和运行 2.3.3 的虚拟设备上进行测试,但结果是相同的。我只是误解了 onPause 的目的,还是我对要调用的 onPause 做错了?

编辑:你能告诉我是否在 onPause() 之后调用 onStop() 什么时候调用 onResume()? onResume 不支持 onPause() 暂停的恢复吗?在我的测试程序中,onResume() 仅在 onStart() 之后调用,而不是在 onPause() 之后调用。可能是因为我只有一项活动?

【问题讨论】:

你没有覆盖Activity.onPause 代码没有显示onPause() 方法的任何日志记录。你怎么知道它没有被调用?相信我......它会被调用。 感谢所有好心回答我愚蠢问题的人。我不敢相信我没有注意到这一点。 :( 每个人都会遇到:) 【参考方案1】:

你还没有重写 onPause() 方法。

public void onPause() 
    super.onPause();
    Log.d(tag, "In the onPause() event");

【讨论】:

【参考方案2】:

onPause 肯定会被调用。但我在您的代码中看不到被覆盖的onPause

onStoponPause 之后调用,当系统认为休眠活动是个好主意。这通常发生在您切换应用程序等时。onResume 在显示活动/片段时在onStart 之后调用。 onResume 是您在用户看到 UI 之前转储代码的地方。

【讨论】:

嗨@meredrica,你能回答我的编辑问题吗? :) 你去。希望这会有所帮助【参考方案3】:

在Java中重写方法时,使用@Override注解是一个很好的习惯:

@Override  // <---- THIS !
public void onDestroy() 
    super.onDestroy();
    Log.d(tag, "In the onDestroy() event");

这样,如果你拼错了方法的名称,编译器会帮助你,它会说该方法不是覆盖。

尝试总是强调这个方法是被覆盖的,而不是一个简单的方法。

在这里,是的,其他人是对的,你没有覆盖onPause 方法。你不能说它是否被调用。

【讨论】:

以上是关于onPause 方法没有被调用的主要内容,如果未能解决你的问题,请参考以下文章

Android中,弹出对话框会使当前页面的Activity回调onPause吗?

如何防止 onPause() 之后调用 onDestroy()?

Android 必知必会:自定义 View 可以知道 onPause/onResume 被调用了吗?

Android 必知必会:自定义 View 可以知道 onPause/onResume 被调用了吗?

Android:在啥情况下出现对话框会导致 onPause() 被调用?

OnResume / OnPause多次调用