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