3

我正在测试这段代码,它显示了活动处于哪个状态

public class Activity101Activity extends Activity {
    String tag  =  "Lifecycle";
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
        // setContentView(R.layout.main);
        setContentView(R.layout.activity_activity101);
        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 onPause()
    {
         super.onPause();
        Log.d(tag , "In the onPause() 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");
    }
}  

所以我看到 onDestroy() 仅在活动在屏幕上时按下后退按钮时才会被调用,否则永远不会被调用。因此,如果我在活动运行时按下主页按钮,它应该在后台运行。但是,如果我去,Settings -> Apps -> Running我无法在列表中看到它。那么这是否意味着它是否在后台运行?

再一次,再一次,这段代码显示 onPause() 总是跟在 onStop() 之后,而 onStart() 总是跟在 onResume() 之后。那么为什么它们在Android环境中被定义为不同的功能而不是组合呢?

4

4 回答 4

3

在这里,我给你关于活动生命周期的 biref 概念......

在此处输入图像描述

创建():

在第一次创建活动时调用。这是您应该进行所有常规静态设置的地方:创建视图、将数据绑定到列表等。此方法还为您提供了一个包含活动先前冻结状态的 Bundle(如果有的话)。始终跟在 onStart() 之后。

重启():

在您的活动停止后、再次开始之前调用。始终跟随 onStart()

开始():

当活动对用户可见时调用。如果活动进入前台,则为 onResume(),如果活动被隐藏,则为 onStop()。

onResume():

当 Activity 开始与用户交互时调用。此时,您的活动位于活动堆栈的顶部,用户输入将转到它。始终跟随 onPause()。

暂停():

当活动进入后台但尚未(尚未)被杀死时,作为活动生命周期的一部分调用。onResume() 的对应项。当活动 B 在活动 A 之前启动时,将在 A 上调用此回调。在 A 的 onPause() 返回之前不会创建 B,因此请确保此处不要做任何冗长的事情。

停止():

当您不再对用户可见时调用。接下来您将收到 onRestart()、onDestroy() 或什么也没有,这取决于以后的用户活动。

请注意,在调用 onPause() 方法后系统没有足够内存来保持活动进程运行的低内存情况下,可能永远不会调用此方法。

销毁():

在您的活动被销毁之前您收到的最后一个电话。这可能是因为 Activity 正在完成(有人在其上调用了 finish(),或者因为系统正在临时销毁该 Activity 实例以节省空间。您可以使用 isFinishing() 方法区分这两种情况。

所以..onStart 方法在 Activity 进入前台而没有用户交互时调用......和 ​​onResume 方法在用户开始交互时调用......所以所有方法的功能都不同..

一旦你按下主页按钮或返回按钮,你的应用程序在后台运行,一旦你从任务管理器中杀死它,它就不会在设置中显示任何内容......

于 2015-11-30T08:47:39.983 回答
2

onStart并不总是跟在onResume. onStart当您的 Activity 可见时onResume调用,并在您的 Activity 处于活动状态时调用。例如,如果有一个部分覆盖它的对话框,则 Activity 可能是可见的,但不是活动的。

于 2013-08-20T01:42:31.243 回答
2

一旦活动进入回栈,它就处于挂起模式。所以你在运行的应用程序列表中看不到它。一旦您重新启动此类暂停的应用程序,它就会从后台进入前台并开始运行。它被保存在后台以保留其状态并从它在进入后台之前停止的地方恢复。

要了解原因,在 onResume 之前需要 onStart,请点击以下链接。它将非常清楚地消除您的所有疑问:

onStart() 和 onResume() 的区别

于 2013-08-20T01:52:34.190 回答
1

那是因为即使 onResume 实际上是 onStart 也有可能不会被调用,有一种情况是活动可能只进入 onPause 而没有进入 onStop [它只发生在活动部分可见,而不是完全被另一个活动覆盖时],因此当返回活动时,只会调用 onResume 而不会调用 onStart。

与 onPause 相同,它总是在 onStop 之前执行,但 onStop 可能不会在 onPause 之后调用,如前所述,它可以在没有实际调用 onStop 的情况下调用。如果您按 HOME,您将看不到我刚才解释的行为,因为该活动不是部分可见的,为了重现它,您必须找到一种方法让另一个组件出现在顶部而不完全覆盖该活动......

希望这可以帮助。

问候!

于 2013-08-20T01:40:19.997 回答