首页投稿(暂停使用,暂停投稿)Android进阶之路Android技术知识

Activity生命周期的自测(对网上一些说法进行纠正)

2016-10-25  本文已影响0人  Mr云台

发现网上一些对于生命周期的说法有问题,于是自己写代码测试一下,并结合官网的说明,对一些说法进行纠正。

1. 基本的生命周期

以下来自官网的说明:
https://developer.android.com/guide/components/activities.html

public class ExampleActivity extends Activity {
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        // The activity is being created.
    }
    @Override
    protected void onStart() {
        super.onStart();
        // The activity is about to become visible.
        //注意,这里说的是将要变为可见,并不是已经可见了
    }
    @Override
    protected void onResume() {
        super.onResume();
        // The activity has become visible (it is now "resumed").
        //网上有人说,onResume代表已经可以与用户交互,这是错的,
        //官网的原话是:在 Activity 即将开始与用户进行交互之前调用。   
        //这句话应该理解成,onResume执行完成才可以与用户交互
        
    }
    @Override
    protected void onPause() {
        super.onPause();
        // Another activity is taking focus (this activity is about to be "paused").
    }
    @Override
    protected void onStop() {
        super.onStop();
        // The activity is no longer visible (it is now "stopped")
    }
    @Override
    protected void onDestroy() {
        super.onDestroy();
        // The activity is about to be destroyed.
    }
}

2.横竖屏切换时候activity的生命周期

1、新建一个Activity,并把各个生命周期打印出来
public class SplashActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.splash_activity);
        
        //设置一个点击,测试弹窗会不会导致生命周期变化
        TextView tv = (TextView)findViewById(R.id.tv);
        tv.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                //Toast.makeText(SplashActivity.this, "ToasTest", Toast.LENGTH_LONG);
                new AlertDialog.Builder(SplashActivity.this).setTitle("test").setMessage("hdghdgh").show();
            }
        });
        Log.i("WQW", "onCreate");
    }



    @Override
    protected void onStart() {
        super.onStart();
        Log.i("WQW", "onStart");

    }

    @Override
    protected void onRestart() {
        super.onRestart();
        Log.i("WQW", "onRestart");

    }

    @Override
    protected void onResume() {
        super.onResume();
        Log.i("WQW", "onResume");

    }

    @Override
    protected void onPause() {
        super.onPause();
        Log.i("WQW", "onPause");

    }

    @Override
    protected void onSaveInstanceState(Bundle outState) {
        super.onSaveInstanceState(outState);
        Log.i("WQW", "onSaveInstanceState");

    }

    @Override
    protected void onStop() {
        super.onStop();
        Log.i("WQW", "onStop");

    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        Log.i("WQW", "onDestroy");

    }

    @Override
    public void onLowMemory() {
        super.onLowMemory();
        Log.i("WQW", "onLowMemory");

    }

    @Override
    public void onTrimMemory(int level) {
        super.onTrimMemory(level);
        Log.i("WQW", "onTrimMemory");

    }

    @Override
    public void onConfigurationChanged(Configuration newConfig) {
        Log.i("WQW", "onConfigurationChanged");
        super.onConfigurationChanged(newConfig);

    }
}
2、运行Activity,得到如下信息
onCreate-->
onStart-->
onResume-->
3、执行横竖屏切换,网上说切竖屏会执行生命周期两次,在5.0、6.0上测试,发现并不会执行两次。
onSaveInstanceState-->
onPause-->
onStop-->
onDestroy-->
onCreate-->
onStart-->
onRestoreInstanceState-->
onResume-->
4、修改AndroidManifest.xml,把该Activity添加 android:configChanges="orientation",执行横竖屏切换,
onSaveInstanceState-->
onPause-->
onStop-->
onDestroy-->
onCreate-->
onStart-->
onRestoreInstanceState-->
onResume-->

为什么是这种结果呢?往下看第5步吧。

5、把步骤4的android:configChanges="orientation" 改成 android:configChanges="orientation||screenSize",执行横竖屏切换,就只打印onConfigChanged。
onConfigurationChanged-->

在API 13以上,需要加入screenSize才能正确响应onConfigurationChanged,下面是官网的原话:https://developer.android.com/guide/topics/resources/runtime-changes.html

注意:从 Android 3.2(API 级别 13)开始,当设备在纵向和横向之间切换时,“屏幕尺寸”也会发生变化。
因此,在开发针对 API 级别 13 或更高版本系统的应用时,
若要避免由于设备方向改变而导致运行时重启(正如 minSdkVersion 和 targetSdkVersion 属性中所声明),
则除了 "orientation" 值以外,您还必须添加 "screenSize" 值。
即,您必须声明 android:configChanges="orientation|screenSize"。
但是,如果您的应用是面向 API 级别 12 或更低版本的系统,
则 Activity 始终会自行处理此配置变更(即便是在 Android 3.2 或更高版本的设备上运行,此配置变更也不会重启 Activity)。
总结:
以上测试主要在红米手机3S上进行,Android 6.0。欢迎大家同样进行测试指正。
上一篇下一篇

猜你喜欢

热点阅读