为什么在以下情况下“onPause”没有被调用?

7
根据文档,“onPause”在以下情况下被调用:
当系统即将开始恢复先前的活动时。
与“onStop”相比,区别在于:
当其他活动已经恢复并覆盖了此活动时,不再对用户可见。
但是当我长按HW-Home键,出现“最近使用的应用程序”时,“onPause”未被调用。
此时,我无法再与原始活动进行交互,但它仍然可见。
我对这种情况感到困惑。请帮忙解释。
非常感谢。 BR, 亨利

你能在onPause()中发布你的代码吗? - Raj
请查看此链接:http://stackoverflow.com/a/9190541/265167 - Yaqub Ahmad
5个回答

9

实际上,当长按主页键时,不会启动任何活动。只有在“最近使用的应用程序”列表中选择一个应用程序时,onPause/onStop才会被调用。

onPause() 的文档非常清晰:

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


谢谢,MobileCushion, 你的答案是正确的。关键在于“最近使用的应用程序”不会被添加到应用程序堆栈中, 因此出现了这个结果。 - Henry

4
在很多现代手机中,最近使用的应用列表是一个活动,并会触发onPause。我已在几款三星和LG手机上进行了测试,其中包名分别为com.android.systemuicom.lge.launcher2
话虽如此,在打开最近应用程序屏幕时,似乎不能依赖于接收到onPause。我很想知道有多少设备不会给您onPause...

3
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的生命周期。

0
@Henry,请尝试通过测试应用程序的流程来自行验证。创建一个活动,在其中覆盖所有的方法,并在所有的方法下打印日志。流程是onCreate>onStart/restart>onResume,当你按下主页按钮或启动任何新的活动时,它会调用onPause>onStop,并且如果你结束你的应用程序,你的应用程序将被销毁/完成,这就是困惑所在。

-1

这是官方文档关于 onPause() 的说明:

当一个 Activity 进入后台但尚未被销毁时,onPause() 方法将作为活动生命周期的一部分被调用。它是 onResume() 方法的对应方法。

当 Activity B 在 Activity A 前面启动时,此回调将在 Activity A 上被调用。只有当 A 的 onPause() 返回时,B 才会被创建,因此请确保不要在此处执行任何耗时操作。

详情请参见 此处


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接