‘壹’ android只支持横屏旋转,监听自动旋转开关
设置横屏其实很简单,就是设置android:screenOrientation就可以。所以我们先来了解一下android:screenOrientation的属性都有哪些?
unspecified,默认值,由系统决定,不同手机可能不一致
landscape,强制横屏显示
portrait,强制竖屏显
behind,与前一个activity方向相同
sensor,根据物理传感器方向转动,用户90度、180度、270度旋转手机方向,activity都更着变化
sensorLandscape,横屏旋转,一般横屏游戏会这样设置
sensorPortrait,竖碰埋屏旋转
nosensor,旋转设备时候,界面不会跟着旋转。初始化界面方向由系统控制
user,用户当前设置的方向
而满足我们需求的属性,分别为
1 landscape :强制横屏,不管自动旋转开关是否开启,都只能是正方向横屏,不会180度旋转
2 sensorLandscape : 横屏旋转,不管自动旋转开关是否开启,都会180度旋转
这两个属性明显不满足我们的需求,这时候我们只能去监听自动旋转开关的状态,然后设置对应的screenOrientation,这样才能满足需求。
但是这只是一次获取,所以我们需求实时监听开关状态。
我们通过誉吵肆ContentObserver来监听自动开关状态的改变
了解了这些之后,我们就能完成需求了
1 初始化监听
2 注册监听庆轿
3 退出时取消监听
4 相关的类与方法
‘贰’ React native orientation 屏幕旋转监听
android 和 iOS 都有在全局设置中固定屏幕方向的办谨纳法,但这样不是特别理桐册想,因为项目中,在不同页面可能会需要横屏或局晌宏竖屏,此时就可以使用 react-native-orientation ,这个扩展可以动态的锁定/解锁屏幕方向,或设置为指定的方向。
安装方式
yarn add react-native-orientation
安装完之后二选一 (这个是 rn 安装原生组件的通用命令)
详情可参考 官方介绍 或 这篇文章
然后继续
android 打开 android/app/src/main/java/com/[project]/MainActivity.java
iOS 打开 ios/[project]/AppDelegate.m
安装完事
使用方法,可直接前往 项目主页 查看,非常简单(其实上面的步骤在项目主页中也有),这里说一个项目主页没提到的
在使用了如 lockToPortrait() 方法锁定屏幕方向后,由 addOrientationListener 添加的监听函数有不同
1、android 上将不会再触发,直到调用 unlockAllOrientations() 解除锁定
2、iOS 则不然,无论屏幕锁定与否,都会触发
‘叁’ android屏幕转换监听的调用public void onConfigurationChanged(Configuration config) 次数的问题
看下这个吧我卖尘哪汇总的:Android横兄简竖切屏注意事项中码
http://hi..com/spare_h/blog/item/11ec0b508163b90e377abeee.html
‘肆’ android 横屏状态,如何监听键盘的弹起与隐藏
android键盘监听不了,只有监听布局的状态,所以要重写布局进行监听
‘伍’ 如何在android studio中实现 横屏 和纵屏 的切换
在AndroidManifest.xml的每一个需要禁止转向的Activity配置中加入android:screenOrientation=”landscape” 属性。
参数说明:
1. landscape = 横向
2. portrait = 纵向
避免在转屏时重启Activity
android中每次屏幕方向切换时都会重启Activity,所以应该在Activity销毁前保存当前活动的状态,在Activity再次 Create的时候载入配置,那样,进行中的游戏就不会自动重启了!
要避免在转屏时重启Activity,可以通过在AndroidManifest.xml文件中重新定义方向(给每个Activity加上 android:configChanges=”keyboardHidden|orientation”属性)。
在需要控制屏幕显示方向的Activity中重写 onConfigurationChanged(Configuration newConfig)方法,这样在转屏时就不会重启Activity了。
‘陆’ Android教程-屏幕方向-横竖屏切换
标签中设置:android:screenOrientation
Activity 在设备上的显示方向。如果 Activity 是在 多窗口模式 下运行,系统会忽略该属性。
其值可以是下列任一字符串:
例如: android:screenOrientation="landscape" 横屏 android:screenOrientation="portrait" 竖屏
‘柒’ Activity横竖屏切换生命周期变化
onCreate ,
创建activity时调用。设置在该方法中,还以Bundle中可以提出用于创建该 Activity 所需的信息。
onStart ,
activity变为在屏幕上对用户可见时,即获得焦点时,会调用。
onResume ,
activity开始与用户交互时调用(无论是启动还是重新启动一个活动,该方法总是被调用的)
onSaveInstanceState
onPause ,
activity被暂停或收回cpu和其他资源时调用,该方法用于保存活动状态的
onStop ,
activity被停止并转为不可见阶段及后续的生命周期事件时,即失去焦点时调用
onDestroy ,
activity被完全从系统内存中移除时调用,该方法被调用可能是因为有人直接调用 finish()方法 或者系统决定停止该活动以释放资源。
onRestoreInstanceState ,
Android在横竖排切换时候,将主动销毁activity和重新创建一个新的activity出来,在此过程中,onRestoreInstanceState就要被回调
onConfigurationChanged ,
配置指定属性后,屏幕方向发生变化后回调此函数.
把该Activity添加
android:configChanges="orientation" ,
执行步骤3(切换成横屏时)
android:configChanges="orientation" 对于4.04.0以上版本不生效
把该Activity添加 android:configChanges="orientation|screenSize" ,
执行步骤3(切换成横屏时)
onConfigurationChanged-->
只打印onConfigChanged
把 android:configChanges="orientation|screenSize" 改成 android:configChanges="orientation|keyboardHidden|screenSize"
执行步骤3(切换横屏幕)
只打印
onConfigChanged
执行步骤4(切换竖屏幕)
只打印onConfigChanged
切记一定要加上后边的screenSize否则在4.0以上版本生命周期执行不生效。
当前Activity产生事件弹出Toast和AlertDialog的时候Activity的生命周期不会有改变
Activity运行时按下HOME键(跟被完全覆盖是一样的):
onPause --> onStop onRestart -->onStart--->onResume
Activity未被完全覆盖只是失去焦点:onPause--->onResume
测试用手机版本5.1.1
Android实现屏幕旋转方法
这种方法的优点:即使屏幕旋转,Activity也不会重新onCreate。
缺点:屏幕只有一个方向。
这个方法的优点:我们可以随时监听屏幕旋转变化,并对应做出相应的操作;
缺点:它只能一次旋转90度,如果一下子旋转180度,onConfigurationChanged函数不会被调用。
4.设置方向的其他方式
在AndroidManifest.xml设置
横向显示,但是基于设备传感器,既可以是按正常方向显示,也可以反向显示,在API Level 9中被引入。
android:screenOrientation="sensorLandscape"
纵向显示,但是基于设备传感器,既可以是按正常方向显示,也可以反向显示,在API Level 9中被引入。
android:screenOrientation="sensorLandscape"
demo
‘捌’ android 如何监听前后台切换
这段时间有需求,需要利用aop切面技术完成数据统计的工作,其中需要统计活跃(定的规则是:用户从后台切换到前台就算一次活跃)。所以关于如何监听前后台切换就有以下的描写。
一.使用ActivityLifecycleCallbacks简单app进入后台
有时需要监听到应用在前后台切换并做些处理,一般的做法可能是建立一个BaseActivity,然后全部的Activity都继承它,在BaseActivity的onStart和onStop中计数去处理。这样并不是最好的方式,不做详细介绍,有更好的方式,道理其实差不多,就是借助ActivityLifecycleCallbacks来实现。
1)写了个帮助类:
2)Application中使用(注意:仅在Application中才能使用,因为Application的生命周期能监听到每个Activity)
原文地址: https://blog.csdn.net/bzlj2912009596/article/details/80073396
‘玖’ VideoView+MediaController横向全屏视频播放+缓冲监听
VideoView继承了SurfaceView同时实现了MediaPlayerControl接口,MediaController是安卓封装的辅助控制器,带有暂停,播放,停止,进度条等控件。通过VideoView+MediaController可以很轻松的实现视频播放、停止、快进、快退等功能。
重写VideoView实现全屏
布局直接布局引用
VideoView与MediaController建立关联
在控制器Activity设置清单文件
android:configChanges="orientation|screenSize|keyboardHidden"
android:screenOrientation="landscape" //Activity 初始默认横竖屏状态
备注:对android:configChanges属性,一般认为有以下几点:
1、不设置Activity的android:configChanges时,切屏会重新调用各个生命周期,切横屏时会执行一次,切竖屏时会执行两次
2、设置Activity的android:configChanges="orientation"时,切屏还是会重新调用各个生命周期,切横、竖屏时只会执行一次
3、设置Activity的android:configChanges="orientation|keyboardHidden"时,切屏不会重新调用各个生命周期,只会执行onConfigurationChanged方法
但是,自从Android 3.2(API 13),在设置Activity的android:configChanges="orientation|keyboardHidden"后,还是一样会重新调用各个生命周期的。因为screen size也开始跟着设备的横竖切换而改变。所以,在AndroidManifest.xml里设置的MiniSdkVersion和 TargetSdkVersion属性大于等于13的情况下,如果你想阻止程序在运行时重新加载Activity,除了设置"orientation",你还必须设置"ScreenSize"。
设置缓冲状态监听,第一次加载视频的时候不会走缓冲状态,第一次视频加载出来会走 播放状态,然后以后缓存的同时会走缓存状态
‘拾’ android 如何监听屏幕当前是否全屏
可以在屏幕的Activity加监听屏幕属性改变,发生改变则检查当前是否全屏状态。
是全屏状态发送,全屏的广播消息,到监听应用触发操作。
@Override
public void onWindowAttributesChanged(LayoutParams params) {
// TODO Auto-generated method stub
super.onWindowAttributesChanged(params);
Log.e(TAG,"onWindowAttributesChanged()"+getWindow().getAttributes().flags);
if (WindowManager.LayoutParams.FLAG_FULLSCREEN == getWindow().getAttributes().flags) {
Log.e(TAG,"onWindowAttributesChanged() FLAG_FULLSCREEN");
}
}
(注意该判断在屏幕切换横竖屏是也会触发,需要根据实际情况过滤横竖屏切换的情况。)