【问题标题】:What methods are invoked in the Activity Lifecycle in the following cases:在以下情况下,Activity Lifecycle 中调用了哪些方法:
【发布时间】:2011-02-16 17:13:44
【问题描述】:

假设我有一个 Hello World 单一活动应用程序。我启动了这个应用程序。

在每种情况下调用了哪些方法:

  • 按下主页按钮:?
    按下返回按钮:?
    接到电话:?

一旦用户通过应用图标再次启动应用,会调用哪些方法(假设操作系统没有“其他应用需要内存条件”):

  • 按下主页按钮:?
    按下后退按钮:?
    接到电话:?

谢谢大家。

编辑:额外积分:用户如何在不调用 onStop 的情况下调用 onPause

【问题讨论】:

标签: android android-activity lifecycle


【解决方案1】:

为了了解活动生命周期我创建了演示见HERE

我添加了不同的案例研究。

MainActivity.java

    public class MainActivity extends AppCompatActivity {

    private static final String TAG = "State changed";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        Log.i(TAG, "onCreate: ");
    }

    public void OpenDialog(View view) {

        final AlertDialog alertDialog = new AlertDialog.Builder(MainActivity.this).create(); //Read Update
        alertDialog.setTitle("hi");
        alertDialog.setMessage("this is my app");

        alertDialog.setButton("Continue..", new DialogInterface.OnClickListener() {
            public void onClick(DialogInterface dialog, int which) {
                // here you can add functions
                alertDialog.dismiss();
            }
        });

        alertDialog.show();  //<-- Show dialog
    }

    @Override
    protected void onStart() {
        super.onStart();
        Log.i(TAG, "onStart: " );
    }

    @Override
    protected void onResume() {
        super.onResume();

        Log.i(TAG, "onResume: ");

    }

    @Override
    protected void onPause() {
        super.onPause();

        Log.i(TAG, "onPause: ");
    }

    @Override
    protected void onStop() {
        super.onStop();
        Log.i(TAG, "onStop: ");
    }

    @Override
    protected void onRestart() {
        super.onRestart();
        Log.i(TAG, "onRestart: ");
    }

    @Override
    public void onSaveInstanceState(Bundle outState) {
        super.onSaveInstanceState(outState);
        Log.i(TAG, "onSaveInstanceState: ");
    }

    @Override
    protected void onRestoreInstanceState(Bundle savedInstanceState) {
        super.onRestoreInstanceState(savedInstanceState);
        Log.i(TAG, "onRestoreInstanceState: ");
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        Log.i(TAG, "onDestroy: ");
    }

    @Override
    public void onBackPressed() {
        super.onBackPressed();
        Log.i(TAG, "onBackPressed: ");
    }

}

案例研究

案例 1 = 首先点击应用图标

注意:这里没有显示 onRestoreInstanceState 因为它在运行时执行

我/状态改变:onCreate:

我/状态改变:onStart:

我/状态改变了:onResume:

案例 2 = 点击主页按钮(屏幕熄灭或来电时同样发生)

我/状态改变:onPause:

我/状态改变了:onSaveInstanceState:

I/状态改变:onStop:

案例 3 =(案例 2 继续)通过最近打开应用程序

I/状态改变:onRestart:

我/状态改变:onStart:

我/状态改变了:onResume:

案例 4 = 单击返回按钮(onBackPressed 方法调用)

我/状态改变:onPause:

I/状态改变:onStop:

我/状态改变:onDestroy:

案例 5 = 配置更改(旋转屏幕)

我/状态改变:onPause:

我/状态改变了:onSaveInstanceState:

I/状态改变:onStop:

我/状态改变:onDestroy:

我/状态改变:onCreate:

我/状态改变:onStart:

我/状态改变了:onRestoreInstanceState:

我/状态改变了:onResume:

【讨论】:

  • @ArpitPatel 在打开或关闭对话框时不会对活动生命周期做出任何改变。
  • @KumarMani 是的,当对话框打开时,它确实会进入 onPaush() 状态,您实际上可以检查。
  • @ArpitPatel,刚才我检查了你给出的代码,它不影响活动生命周期。请检查一次好吗?
  • 是的,你是对的 onPaush() 不是用 AlertDialog.Builder 调用的,但是如果你当时使用对话框片段 onPaush() 调用。
【解决方案2】:

按下主页按钮和接收呼叫都不会从任务堆栈中删除活动,并且在您重新进入应用程序时可用 => onPause() => onStop()。

activity lifecycle diagram 所示,重新进入应用调用 => onRestart() => onStart() => onResume()

按下后退按钮会杀死活动 => onPause() => onStop() => onDestroy()

在这种情况下重新进入应用程序调用经典 => onCreate() => onStart() => onResume()

编辑

来自http://developer.android.com/reference/android/app/Activity.html#ActivityLifecycle

如果活动失去焦点但 仍然可见(即,一个新的 非全尺寸或透明活动 专注于您的活动),它 暂停。暂停的活动是 完全活着(它保持所有 国家和成员信息和 仍然附着在窗户上 经理),但可以被 系统内存极低 情况。

【讨论】:

    【解决方案3】:

    可能有几种情况

    1. 从应用图标打开应用。调用以下方法

      onCreate()-->onStart()-->onResume()

    2. 当用户按下主页按钮时

      onPause()-->onStop()

    3. 当用户从 Activity Stack 返回应用时

      onRestart()-->onStart()--> onResume()

    4. 当应用程序正在运行并且用户按下电源按钮时

      onPause()-->onStop()

    5. 当用户解锁手机时

      onRestart()-->onStart()--> onResume()

    6. 当您在应用中时用户接到来电

      onPause()

    7. 用户断开电话后返回应用时

      onResume()

    8. 当用户从应用中按下返回按钮时

      onPause()-->onStop()-->onDestroy()

    9. 当用户按下主页按钮并从活动堆栈中滑动时,app.onDestroy() 方法可能会或可能不会被调用,具体取决于操作系统是否包含 Activity 的上下文,具体取决于内存要求

    【讨论】:

    • 如果我遗漏了任何案例,请告诉我
    【解决方案4】:

    好吧,虽然您的 hello world 程序可能会发生一系列事件,但在视频游戏中可能不会发生相同的事件,因为 Android 可能会因为占用太多资源而将其销毁。

    我发现查看应用程序生命周期的最佳方法是覆盖所有方法(onStart、onRestart、...,包括 onSaveInstance 和 onRestoreInstance)并在每个方法中插入日志语句。像这样:

    @Override
    public void onDestroy() {
        // Call the super class 
        super.onDestroy();
        // Log the action
        Log.d("Debug", "onDestroy() has been called!");
    }
    

    现在我可以去 logcat 看看发生了哪些事件。

    【讨论】:

      猜你喜欢
      • 2021-11-02
      • 2015-04-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-02-07
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多