1. 程式人生 > >Android-SurfaceView生命週期

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