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