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被銷毀了------------

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM