【问题标题】:why "onPause" is not called in following situation?为什么在以下情况下不调用“onPause”?
【发布时间】:2012-03-02 19:39:06
【问题描述】:

通过文档,“onPause”被调用,当:

当系统即将开始恢复之前的活动时。

与“onStop”相比,区别在于:

当 Activity 不再对用户可见时调用,因为另一个 Activity 已经恢复并覆盖了这个。

但是当我长按 HW-Home 键并显示“最近的应用程序”时, 没有调用“onPause”。

此时,我无法再与原来的活动交互, 但它仍然可见。

我对这种情况感到困惑。 请帮忙解释一下。

非常感谢。 BR, 亨利

【问题讨论】:

标签: android android-activity lifecycle timing onpause


【解决方案1】:

@Henry 请通过测试应用程序的流程来尝试自己。创建一个覆盖所有方法并在所有方法下打印日志的活动。流程是 onCreate>>onStart/restart>>onResume,当您按下主页按钮或启动任何新活动时,它会调用 onPause>>onStop,如果您完成应用程序,那么您的应用程序将被销毁/完成,所以哪里有混乱。

【讨论】:

    【解决方案2】:

    这实际上是因为当长按 Home 键时,没有启动任何活动。仅当您选择“最近使用的应用程序”列表中存在的应用程序之一时才会调用 onPause/onStop。

    onPause() 的文档非常清楚:

    在活动进行时作为活动生命周期的一部分调用 进入后台,但尚未(尚未)被杀死。

    【讨论】:

    • 谢谢,MobileCushion,您的回答是正确的。关键是“最近的应用程序”不会被添加到应用程序堆栈中,因此是结果。
    【解决方案3】:

    这是官方文档中关于onPause()的说法

    在活动进行时作为活动生命周期的一部分调用 进入后台,但尚未(尚未)被杀死。对应的 onResume()。

    当活动 B 在活动 A 之前启动时,此回调将 在 A 上调用。在 A 的 onPause() 返回之前不会创建 B,因此 一定不要在这里做任何冗长的事情。

    详情please see this

    【讨论】:

      【解决方案4】:
      public class MainActivity extends Activity
      {
          String tag="my result";
      
          public void onCreate(Bundle savedInstanceState) 
          {
              super.onCreate(savedInstanceState);
              setContentView(R.layout.main);
      
              Log.v(tag,"I am in oncreate");
          }
      
          @Override
          protected void onDestroy() {
              // TODO Auto-generated method stub
              super.onDestroy();
              Log.v(tag,"I am in onDestroy");
          }
      
          @Override
          protected void onPause() {
              // TODO Auto-generated method stub
              super.onPause();
              Log.v(tag,"I am in onpause");
          }
      
          @Override
          protected void onRestart() {
              // TODO Auto-generated method stub
              super.onRestart();
              Log.v(tag,"I am in onRestart");
          }
      
          @Override
          protected void onResume() {
              // TODO Auto-generated method stub
              super.onResume();
              Log.v(tag,"I am in onresume");
          }
      
          @Override
          protected void onStart() {
              // TODO Auto-generated method stub
              super.onStart();
              Log.v(tag,"I am in onstart");
          }
      
          @Override
          protected void onStop() {
              // TODO Auto-generated method stub
              super.onStop();
              Log.v(tag,"I am in onstop");
          }
      }
      

      运行它并检查logcat。按下后退按钮然后检查。再次启动应用程序并

      按调用按钮然后检查 logcat 现在按返回按钮并再次检查 logcat。可以轻松了解Activity的生命周期。

      【讨论】:

        【解决方案5】:

        在许多现代手机中,最近的应用列表是一个活动,并且会触发onPause。我已经在几部三星和 LG 手机上测试过,包分别是 com.android.systemuicom.lge.launcher2

        也就是说,当您打开最近的应用程序屏幕时,您似乎不能依赖接收 onPause。我很想知道有多少设备不给你onPause...

        【讨论】:

          猜你喜欢
          • 2015-05-26
          • 2023-03-18
          • 1970-01-01
          • 2011-11-06
          • 1970-01-01
          • 2011-07-08
          • 2021-08-09
          • 1970-01-01
          • 2016-09-25
          相关资源
          最近更新 更多