Activity生命周期(包括横竖屏时特殊情况)

本文详细解析了Android中Activity的生命周期,包括四个主要状态:运行、暂停、停止和销毁,并阐述了每个状态对应的回调方法的作用。此外,还介绍了如何通过配置实现横竖屏切换时保持Activity状态不变的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.Activity的生命周期

指一个Activity从创建到销毁的过程,期间可能经历多个状态的变化,每次状态的变化都会触发相应的回调方法。

Activity生命周期分为四个阶段:

  • 运行状态:可见,并且可操作
    onCreate–onStart—onResume
    onRestart–onStart—onResume
  • 暂停状态:可见,但是不可操作
    onPause
  • 停止状态:不可见,并且也不可操作
    onStop
  • 销毁状态:该Activity结束,或Activity所在的Dalivik进程被结束
    onDestory

  • onCreate():Activity在实例化过程被调用,进行创建工作,只会调用一次,一般创建界面,做一些数据的初始化工作。

  • onStart():Activity启动过程的回调函数。
  • onResume():恢复Activity时被回调,onStart()方法后一定会回调该方法,可操作。
  • onPause():暂停Activity时被回调(Activity失去操作焦点,但可见),系统会停止动画等消耗CPU的事情。应该在这里保存你的一些数据,因为这个时候你的程序的优先级降低,有可能被系统收回。在这里保存的数据,应该在onResume里读出来。
  • onStop():停止Activity时被回调(Activity失去操作焦点,不可见)。
  • onDestory():销毁Activity时被回调,该方法只会被调用一次(回收资源)这是Activity被kill前最后一个被调用方法了。
  • onRestart():这个方法在活动由停止状态变为运行状态之前调用,也就是活动被重新启动了。

2.横竖屏切换时使其生命周期不会发生改变

  • 当进行横竖屏切换的时候,activity的生命周期会变成onPause–>onSaveInstanceState–>onStop–>onDestroy–>oncreate–>onStart–>onResume,可以看出,activity重新执行了一次,oncreate到onResume,
    这样子的话之前的数据就会被丢失掉,这时候就要涉及到onSaveInstanceState保存数据了,然后在onCreate方法里面通过Bundle获取之前保存的数据。
  • AndroidManifest.xml中设置android:configChanges=”orientation|screenSize|keyboardHidden”

3.有时候我们必须要屏幕横竖屏都可以自由切换的时候,这个时候就要准备两套方案了,方法步骤:

  • 在res包下新建一个文件夹:layout-land,在这个文件夹里面需要写你想要横竖屏切换的页面的布局的名字,注意,和layout中的布局名字要相同,如:activity_main,那个在layout-land中的xml布局文件也必须要写成这个名字
### HTML5 Video 标签全屏播放与横竖屏适配解决方案 HTML5 的 `<video>` 标签提供了多种属性和方法,可以用来实现全屏播放以及适配横屏和竖屏的功能。以下是详细的解决方案: #### 1. 使用 `requestFullscreen` 方法实现全屏播放 现代浏览器支持通过 JavaScript 调用 `requestFullscreen()` 方法来让视频进入全屏模式。此方法适用于大多数主流浏览器。 ```javascript const videoElement = document.querySelector('video'); // 进入全屏模式 function enterFullScreen() { if (videoElement.requestFullscreen) { videoElement.requestFullscreen(); } else if (videoElement.mozRequestFullScreen) { // Firefox videoElement.mozRequestFullScreen(); } else if (videoElement.webkitEnterFullscreen) { // Safari videoElement.webkitEnterFullscreen(); } } ``` 需要注意的是,某些移动设备可能不完全支持标准的全屏 API,因此需要额外考虑兼容性问题[^1]。 --- #### 2. 设置 CSS 属性以适配屏幕方向 为了确保视频能够正确填充整个屏幕,无论处于横屏还是竖屏状态,可以通过设置 CSS 来调整视频的比例。 ```css video { width: 100%; height: auto; max-width: 100%; /* 确保视频不会超出父容器 */ } /* 当进入全屏,强制拉伸至覆盖整个屏幕 */ @media (orientation: landscape) { video { width: 100vw; height: 100vh; object-fit: cover; /* 自动裁剪多余部分 */ } } @media (orientation: portrait) { video { width: 100vw; height: calc(100vw * 9 / 16); /* 维持常见比例 */ object-fit: contain; /* 完整显示内容 */ } } ``` 以上样式定义了视频在不同屏幕方向下的表现形式,并利用 `object-fit` 属性控制视频的内容缩放行为[^4]。 --- #### 3. 处理移动端特殊限制 在移动端(尤其是 iOS 和 Android 上嵌套 WebView 的场景),可能会遇到一些特殊的限制或问题,例如无法隐藏默认的全屏按钮或者无法自由操作 DOM 元素。针对这些问题,有以下几种解决办法: ##### (1)禁用微信内置 X5 浏览器中的默认全屏按钮 如果目标平台是基于微信环境,则可通过设置特定属性启用同层播放模式,从而移除右上角的“全屏”按钮并增强用户体验。 ```html <video src="example.mp4" controls x5-video-player-type="h5" x5-video-player-fullscreen="true"> </video> ``` 这些属性仅对腾讯 X5 内核有效,允许开发者更灵活地定制视频播放界面[^2]。 ##### (2)拦截 Android WebView 中的全屏事件 当使用 Android WebView 加载网页,默认情况下点击全屏按钮会触发系统的原生处理流程。为了避免这种情况,可以在 Activity 中重写相关回调函数,接管全屏逻辑。 ```java @Override public void onShowCustomView(View view, CustomViewCallback callback) { super.onShowCustomView(view, callback); FrameLayout fullScreenContainer = findViewById(R.id.fl_video); fullScreenContainer.setVisibility(View.VISIBLE); fullScreenContainer.addView(view); setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE); // 切换到横屏 } @Override public void onHideCustomView() { super.onHideCustomView(); FrameLayout fullScreenContainer = findViewById(R.id.fl_video); fullScreenContainer.removeAllViews(); fullScreenContainer.setVisibility(View.GONE); setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); // 返回竖屏 } ``` 这段代码展示了如何捕获全屏视图的变化,并手动管理其生命周期[^3]。 --- #### 4. 动态检测屏幕方向并响应 为了让应用程序更加智能化,还可以借助 JavaScript 或者框架监听屏幕方向的变化,并实调整 UI 布局。 ```javascript window.addEventListener("resize", () => { const isLandscape = window.innerWidth > window.innerHeight; if (isLandscape) { console.log("当前为横屏"); // 执行横屏专属逻辑 } else { console.log("当前为竖屏"); // 执行竖屏专属逻辑 } }); ``` 这种方法特别适合那些需要根据不同方向加载差异化资源的应用程序。 --- ### 总结 综合来看,要实现跨平台、高质量的 HTML5 视频全屏播放体验,需结合前端技术栈的特点分别应对桌面端与移动端的不同挑战。具体而言,应优先尝试标准化接口如 `requestFullscreen()`;同辅以针对性优化策略——比如配置专属于微信生态的扩展参数或是深入干预 Android WebView 行为。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值