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被销毁了------------

Android-SurfaceView生命周期的更多相关文章

  1. Android 进程生命周期 Process Lifecycle

    Android 进程生命周期 Process Lifecycle 进程的生命周期 Android系统会尽力保持应用的进程,但是有时为了给新的进程和更重要的进程回收一些内存空间,它会移除一些旧的进程. ...

  2. Android的生命周期学习

    掌握Android的生命周期对于如何一个刚刚接触Android初学者来说是至关重要的,在然后的开发中会给我留有更多的时刻余地,当自己正在认识Android中整个声明周期后,会编写出更加的流畅的程序 应 ...

  3. android 的生命周期自我理解

    android的active的生命周期,经过网站的blog学习,加上自己的理解总结如下: 第1种:全新的启动应用程序顺序 onCreate--->onStart---->onResume ...

  4. Android组件生命周期(二)

    引言 应用程序组件有一个生命周期——一开始Android实例化他们响应意图,直到结束实例被销毁.在这期间,他们有时候处于激活状态,有时候处于非激活状态:对于活动,对用户有时候可见,有时候不可见.组件生 ...

  5. 详解 Android Activity 生命周期

    从以下几个方面详细说一下Activity的生命周期: 1.回到主屏幕再打开和退出程序的时候. 2.屏幕旋转的时候. 3.打开其它的Activity的情况. 4.打开一个Layou透明的Activity ...

  6. [转]: 两分钟彻底让你明白Android Activity生命周期(图文)!

    转自:http://blog.csdn.net/android_tutor/article/details/5772285 大家好,今天给大家详解一下Android中Activity的生命周期,我在前 ...

  7. Android Activity生命周期

    从android api文档摘抄出来的activity生命周期图如下: Activity有如下四种状态 a.活动状态  activity处于屏幕前台,获取到了焦点可以和用户进行交互,同一时刻只有一个a ...

  8. Android Activity生命周期详讲

    管理 Activity 生命周期 通过实现回调方法管理 Activity 的生命周期对开发强大而又灵活的应用至关重要. Activity 的生命周期会直接受到 Activity 与其他 Activit ...

  9. android Activity生命周期(设备旋转、数据恢复等)与启动模式

    1.Activity生命周期     接下来将介绍 Android Activity(四大组件之一) 的生命周期, 包含运行.暂停和停止三种状态,onCreate.onStart.onResume.o ...

  10. Android Fragment 生命周期及其API使用(建议使用自定义View替换Fragment)

    我为什么不主张使用Fragment Fragment:( Fragment就相当于一个有生命周期的View,它的生命周期被所在的Activity的生命周期管理 ) 生命周期回调说明: onAttach ...

随机推荐

  1. Oracle VM Virtualbox基础知识

    修改硬盘的UUID VBoxManage internalcommands sethduuid <filename>

  2. PY安装模块

    Python安装失败原因 0环境 , pip版本一般为 7.x , 所以一般需要先升级pip版本 , 也就是执行 ```shellpython -m pip install --upgrade pip ...

  3. 20165233 实验一 Java开发环境的熟悉

    20165233 实验一 Java开发环境的熟悉 实验要求 1.没有Linux基础的同学建议先学习<Linux基础入门(新版)><Vim编辑器> 课程: 2.完成实验.撰写实验 ...

  4. ASP.NET中的几种弹出框提示基本实现方法

    我们在.NET程序的开发过程中,常常需要和用户进行信息交互,比如执行某项操作是否成功,“确定”还是“取消”,以及选择“确定”或“取消”后是否需要跳转到某个页面等,下面是本人对常用对话框使用的小结,希望 ...

  5. 2.ehcache.xml简介

    转自:https://www.cnblogs.com/crazylqy/p/4238148.html ehcache.xml文件是用来定义Ehcache的配置信息的,更准确的来说它是定义CacheMa ...

  6. Linux 文件管理命令语法、参数、实例全汇总(一)

    命令:cat   cat 命令用于连接文件并打印到标准输出设备上. 使用权限 所有使用者 语法格式 cat [-AbeEnstTuv] [--help] [--version] fileName 参数 ...

  7. .NET高级软件工程师面试题排行榜(转载)

    原文引用:https://m.sanwen8.cn/p/104gMSd.html 一.对于 Web 性能优化,您有哪些了解和经验吗? 出现指数:五颗星 主要考点:这道题是博主在博客园的新闻里面看到的, ...

  8. Python运维开发基础04-语法基础

    上节作业回顾(讲解+温习90分钟) #!/usr/bin/env python3 # -*- coding:utf-8 -*- # author:Mr.chen # 仅用列表+循环实现"简单 ...

  9. JavaScript中call,apply,bind方法

    why?call,apply,bind干什么的?为什么要学这个? 一般用来指定this的环境,在没有学之前,通常会有这些问题. var a = { user:"追梦子", fn:f ...

  10. SO_LINGER

    [SO_LINGER] 在默认情况下,当调用close关闭socket的使用,close会立即返回,但是,如果send buffer中还有数据,系统会试着先把send buffer中的数据发送出去,然 ...