Android 浅谈Activity 的生命周期

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/dhl_1986/article/details/82626845

说到Activity 的生命周期,就不得不提这个经典Activity周期图:

从下面四点来说明Activity 的生命周期

1,Activity 的7种状态

     (1)onCreate() : Activity 已经开启,但是对用户还不可见 。使用场景:初始化一些数据和View ,绑定Adapter 等等。

    (2)onStart() :这个时候Activity 已经可见了,但是还不能和User 交互。使用场景:注册广播响应UI,这个生命周期用的并不太多。

    (3)onResume() :这个时候Activity 代表在前台,并且可以和用户交互。使用场景:启动动画,打开相机等。

    (4)onPause ():与onResume() 成对,这个状态不能与用户交互了。使用场景:释放一些onResume占用资源和保存一些数据,比如聊天界面保存草稿。

    (5)onStop() :与onStart() 成对,这个状态已经不可见了。使用场景:释放一些onStart 占用的资源。

   (6)onDestroy() :与onCreate 成对,Activity 销毁。使用场景:释放这个Activity 占用的资源。

    (7)onRestart() :onStop() 后背重新唤起调用。使用场景:一些刷新操作。

      这7种状态可以总结为四种状态

2,Activity 四种状态

   (1)Running : 可见状态 (onCreate(),onStart(),onResume()),并且可以和用户交互。

   (2)Paused :  可见但不是不能喝用户交互(onPause())。

   (3)Stoped: 不可见(onStop())。

   (4)Killed : Activity 被销毁。

3,onStart()和onResume()/onPause()和onStop()的区别?

      onStart() 与onResume() 最大的区别 是 onResume 表明可以和用户交互,而onStart只是可见,并不能交互。

      onPause() 与onStop() 最大的区别是 onPause 是可见的,但是不可见交互,但是onStop 是完全不可见的。

     onStart()与onStop() 和 onResume() 与onPause() 总是成对出现。

4,Activity A启动另一个Activity B会回调哪些方法?如果Activity B是完全透明呢?如果启动的是一个Dialog呢?

 这是MainActivity (A)

public class MainActivity extends AppCompatActivity {

    private static final String TAG = "MainActivity";
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Log.e(TAG,"onCreate-----------");

        findViewById(R.id.sec_activity).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent = new Intent(MainActivity.this,SecActivity.class);
                startActivity(intent);
            }
        });
    }

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

    @Override
    protected void onResume() {
        super.onResume();
        Log.e(TAG,"onResume-----------");
    }

    @Override
    protected void onPause() {
        super.onPause();
        Log.e(TAG,"onPause-----------");
    }

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

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

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

 MainActivity 启动后日志:

09-11 19:20:47.031 9204-9204/com.fiberhome.activitylifecycle E/MainActivity: onCreate-----------
09-11 19:20:47.031 9204-9204/com.fiberhome.activitylifecycle E/MainActivity: onStart-----------
09-11 19:20:47.033 9204-9204/com.fiberhome.activitylifecycle E/MainActivity: onResume-----------

启动SecActivity (B)后日志:

09-11 19:21:42.359 9204-9204/com.fiberhome.activitylifecycle E/MainActivity: onPause-----------
09-11 19:21:42.791 9204-9204/com.fiberhome.activitylifecycle E/MainActivity: onStop-----------

这说明:

A 启动B ,A会回调 onPause(),onStop()。

设置SecActivity(B) 透明

<style name="Theme.AppCompat.Translucent" parent="Theme.AppCompat.NoActionBar">
        <item name="android:background">#33000000</item> <!-- Or any transparency or color you need -->
        <item name="android:windowNoTitle">true</item>
        <item name="android:windowBackground">@android:color/transparent</item>
        <item name="android:colorBackgroundCacheHint">@null</item>
        <item name="android:windowIsTranslucent">true</item>
        <item name="android:windowAnimationStyle">@android:style/Animation</item>
    </style>
 <activity
            android:name=".SecActivity"
            android:theme="@style/Theme.AppCompat.Translucent"
            ></activity>

启动后日志:

09-11 19:24:16.220 9618-9618/com.fiberhome.activitylifecycle E/MainActivity: onPause-----------

这说明:

A启动B之后,A仍然可见,A回调onPause(),不会回调onStop()。对比 1 中的 onPause() 和onStop()。

如果启动一个Dialog ,结果又会怎么样呢?

public class MainActivity extends AppCompatActivity {

    private static final String TAG = "MainActivity";
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Log.e(TAG,"onCreate-----------");

        findViewById(R.id.sec_activity).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
              /*  Intent intent = new Intent(MainActivity.this,SecActivity.class);
                startActivity(intent);*/

                AlertDialog.Builder alertDialog = new AlertDialog.Builder(MainActivity.this);
                alertDialog.setTitle("test").setMessage("test").setNegativeButton("取消", new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which) {

                    }
                }).setPositiveButton("确定", new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        
                    }
                }).show();
              /*  alertDialog.show();
                ProgressDialog loadingDialog = ProgressDialog.show(MainActivity.this, null, "test");
                loadingDialog.setProgressStyle(ProgressDialog.STYLE_SPINNER);
                loadingDialog.show();// 设置圆形旋转进度条*/
            }
        });
    }

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

    @Override
    protected void onResume() {
        super.onResume();
        Log.e(TAG,"onResume-----------");
    }

    @Override
    protected void onPause() {
        super.onPause();
        Log.e(TAG,"onPause-----------");
    }

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

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

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

点击后发现并没有回调任何生命周期,

由此看出,启动一个Dialog  不会回调上面的7种方法。

猜你喜欢

转载自blog.csdn.net/dhl_1986/article/details/82626845