• Android-SurfaceView生命周期


    SurfaceView的生命周期,和 Activity生命周期,Service生命周期,BroadcastReceiver生命周期,等,不一样;

    因为SurfaceView显示的是(视频画面游戏画面相机画面),SurfaceView显示的是动态的画面,而且对性能要求很高,所以SurfaceView的生命周期是这样:

    SurfaceView的生命周期:

                当Activity完全显示之后,SurfaceView才会被创建

                只要Activity不是在前台,SurfaceView就会销毁

      

    想要操作SurfaceView就要操作SurfaceHolder,所以并不是直接操作SurfaceView,而是要操作SurfaceView提供的对象:SurfaceHolder


    在activity_surface_view.xml布局文件中定义SurfaceView

    <?xml version="1.0" encoding="utf-8"?>
    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent" 
        android:layout_height="match_parent">
        
        <!--
            定义SurfaceView
        -->
        <SurfaceView
            android:id="@+id/surface_view"
            android:layout_width="match_parent"
            android:layout_height="match_parent" />
    
    </RelativeLayout>

    观察SurfaceView的生命周期Java代码:

    package liudeli.my_media1;
    
    import android.app.Activity;
    import android.os.Bundle;
    import android.util.Log;
    import android.view.SurfaceHolder;
    import android.view.SurfaceView;
    
    public class MySurfaceViewActivity extends Activity {
    
        private final String TAG = MySurfaceViewActivity.class.getSimpleName();
    
        /**
         * 操作的是SurfaceHolder,所以定义全局变量
         */
        private SurfaceHolder surfaceHolder;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
    
            setContentView(R.layout.activity_surface_view);
    
            // 获取在布局文件中定义的SurfaceView
            SurfaceView surfaceView = findViewById(R.id.surface_view);
    
            // 不能直接操作SurfaceView,需要通过SurfaceView拿到SurfaceHolder
            surfaceHolder = surfaceView.getHolder();
    
            // 使用SurfaceHolder设置屏幕高亮,注意:所有的View都可以设置 设置屏幕高亮
            surfaceHolder.setKeepScreenOn(true);
    
            // 使用SurfaceHolder设置把画面或缓存 直接显示出来
            surfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
    
            /**
             * 由于要观察SurfaceView生命周期,所以需要设置监听
             * 此监听不一样,是addCallback
             *
             */
            surfaceHolder.addCallback(callback);
        }
    
        @Override
        protected void onStart() {
            super.onStart();
            Log.d(TAG, ">>>> onStart()");
        }
    
        @Override
        protected void onResume() {
            super.onResume();
            Log.d(TAG, ">>>> onResume()");
        }
    
        @Override
        protected void onPause() {
            super.onPause();
            Log.d(TAG, ">>>> onPause()");
        }
    
        @Override
        protected void onStop() {
            super.onStop();
            Log.d(TAG, ">>>> onStop()");
        }
    
        /**
         * 定义SurfaceView监听回调
         */
        private SurfaceHolder.Callback callback = new SurfaceHolder.Callback() {
    
            /**
             * surfaceHolder被创建了
             * @param holder
             */
            @Override
            public void surfaceCreated(SurfaceHolder holder) {
                Log.d(TAG, "----------- surfaceHolder被创建了------------");
            }
    
            /**
             * surfaceHolder发生改变了
             * @param holder
             * @param format
             * @param width
             * @param height
             */
            @Override
            public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
                Log.d(TAG, "----------- surfaceHolder发生改变了------------");
            }
    
            /**
             * surfaceHolder被销毁了
             * @param holder
             */
            @Override
            public void surfaceDestroyed(SurfaceHolder holder) {
                Log.d(TAG, "----------- surfaceHolder被销毁了------------");
            }
        };
    
        /**
         * 当Activity被销毁的时候,一定要移除监听
         */
        @Override
        protected void onDestroy() {
            super.onDestroy();
            Log.d(TAG, ">>>> onDestroy()");
            if (null != callback) surfaceHolder.removeCallback(callback);
        }
    }

    观察SurfaceView的生命周期

    SurfaceView的生命周期Log日志:

      Activity必须完全被显示之后,也就是调用了onResume()方法之后才会被创建

          12-20 22:19:26.090 9868-9868/liudeli.my_media1 D/MySurfaceViewActivity: >>>> onStart()
          12-20 22:19:26.090 9868-9868/liudeli.my_media1 D/MySurfaceViewActivity: >>>> onResume()

          12-20 22:19:26.453 9868-9868/liudeli.my_media1 D/MySurfaceViewActivity: ----------- surfaceHolder被创建了------------

          12-20 22:19:26.453 9868-9868/liudeli.my_media1 D/MySurfaceViewActivity: ----------- surfaceHolder发生改变了------------

      

      只要Activity不在前台,也就是调用了onPause()方法之后才会被销毁

          12-20 22:19:42.593 9868-9868/liudeli.my_media1 D/MySurfaceViewActivity: >>>> onPause()

          12-20 22:19:42.701 9868-9868/liudeli.my_media1 D/MySurfaceViewActivity: ----------- surfaceHolder被销毁了------------

  • 相关阅读:
    Java学习笔记之——常用快捷键(eclipse)
    Java学习笔记之——Java介绍
    Linux系统下curl命令上传文件,文件名包含逗号无法上传
    系统操作注意事项
    Shell脚本8种字符串截取方法总结
    亚特兰蒂斯酒店-服务器不能访问故障
    Keepalived 进程无法关闭
    python2.7.9安装mysql-python模块
    卸载Mariadb-报错
    新添加一块硬盘制作LVM卷并进行分区挂载
  • 原文地址:https://www.cnblogs.com/android-deli/p/10146524.html
Copyright © 2020-2023  润新知