在以下情况下,活动生命周期中调用了哪些方法:

时间:2011-02-16 17:13:44

标签: android android-activity lifecycle

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

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

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

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

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

谢谢大家。

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

4 个答案:

答案 0 :(得分:24)

按下主页按钮并接听来电都不会从任务堆栈中删除该活动,并且当您重新进入该应用程序时将可用该操作=> onPause()=>的onStop()。

activity lifecycle diagram所示,重新进入app calls => onRestart()=> onStart()=>的onResume()

按后退按钮代替杀死activity => onPause()=> onStop()=>的onDestroy()

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

修改

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

  

如果活动失去焦点但是   仍然可见(即一个新的   非全尺寸或透明的活动   它专注于你的活动之上)   暂停了。暂停的活动是   完全活着(它维持着一切   州和会员信息和   仍然附着在窗户上   经理),但可以被杀死   极低内存的系统   的情况。

答案 1 :(得分:20)

了解 ACTIVITY LIFECYCLE 我创建演示请参阅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,因为它在运行时

上执行

I / State已更改:onCreate:

I / State已更改:onStart:

I / State已更改:onResume:

案例2 =点击主页按钮(当屏幕关闭或来电时相同)

I / State已更改:onPause:

I / State已更改:onSaveInstanceState:

I / State已更改:onStop:

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

I / State已更改:onRestart:

I / State已更改:onStart:

I / State已更改:onResume:

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

I / State已更改:onPause:

I / State已更改:onStop:

I / State已更改:onDestroy:

案例5 =迁移变更(旋转屏幕)

I / State已更改:onPause:

I / State已更改:onSaveInstanceState:

I / State已更改:onStop:

I / State已更改:onDestroy:

I / State已更改:onCreate:

I / State已更改:onStart:

I / State已更改:onRestoreInstanceState:

I / State已更改:onResume:

答案 2 :(得分: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看看发生了什么事。

答案 3 :(得分:0)

可能有几种情况

  1. 从应用程序图标打开应用程序。以下方法称为

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

  2. 用户按下主屏幕按钮

    onPause()-> onStop()

  3. 用户从“活动堆栈”返回到应用程序

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

  4. 应用运行时,用户按下电源按钮

    onPause()-> onStop()

  5. 用户解锁手机时

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

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

    onPause()

  7. 用户在断开电话后返回到应用程序

    onResume()

  8. 用户在应用中按下后退按钮

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

  9. 并且当用户按下主页按钮并从活动堆栈中滑动时,取决于操作系统是否包含Activity的上下文,是否调用OS.onDestroy()方法取决于内存是否需要