防止activity转屏幕后调用oncreate的方法
在介绍之前,我们需要先了解默认情况下android屏幕旋转的机制:
默认情况下,当用户手机的重力感应器打开后,旋转屏幕方向,会导致当前activity发生onDestroy-> onCreate,这样会重新构造当前activity和界面布局,如果在Camera界面,则表现为卡顿或者黑屏一段时间。如果是在横竖屏UI设计方面,那么想很好地支持屏幕旋转,则建议在res中建立layout-land和layout-port两个文件夹,把横屏和竖屏的布局文件分别放入对应的layout文件夹中。
了解了这些以后,我们对android的屏幕旋转方法进行如下总结:
1,AndroidManifest.xml设置
如果单单想设置横屏或者竖屏,那么只需要添加横竖屏代码:
android:screenOrientation=”landscape”横屏设置;android:screenOrientation=”portrait”竖屏设置;
这种方法的优点:即使屏幕旋转,Activity也不会重新onCreate。
缺点:屏幕只有一个方向。
2,代码动态设置
如果你需要动态改变横竖屏设置,那么,只需要在代码中调用setRequestedOrientation()函数:
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);//横屏设置
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);//竖屏设置
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED);//默认设置
这种方法优点:可以随意动态设置,满足我们人为改变横竖屏的要求,同时满足横竖屏UI不同的设计需求;
缺点:如果改变设置,那么,Activity会被销毁,重新构建,即重新onCreate;
3,重写onConfigurationChanged
如果你不希望旋转屏幕的时候Activity被不断的onCreate(这种情况往往会造成屏幕切换时的卡顿),那么,可以使用此方法:
首先,在AndroidMainfest.xml中添加configChanges:
1
2
3
|
</activity>
|
注意,keyboardHidden表示键盘辅助功能隐藏,如果你的开发API等级等于或高于13,还需要设置screenSize,因为screenSize会在屏幕旋转时改变;
1
|
android:configChanges= "keyboardHidden|orientation|screenSize"
|
然后,在Activity中重写onConfigurationChanged方法,这个方法将会在屏幕旋转变化时,进行监听处理:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
|
<pre class = "java" name= "code" > public void onConfigurationChanged(Configuration newConfig) {
// TODO Auto-generated method stubsuper.onConfigurationChanged(newConfig);
if (newConfig.orientation==Configuration.ORIENTATION_LANDSCAPE) {
// Nothing need to be done here
} else {
// Nothing need to be done here
}
}
</pre>
<pre class = "brush:java;" ></pre>
这个方法的优点:我们可以随时监听屏幕旋转变化,并对应做出相应的操作;
缺点:它只能一次旋转 90 度,如果一下子旋转 180 度,onConfigurationChanged函数不会被调用。
4 ,结合OrientationEventListener,自定义旋转监听设置
如果你想更加完美,更加完全的掌控监听屏幕旋转变化,比如,转屏时不想重新onCreate,尤其是在Camera界面,不想出现旋转preview时屏幕的卡顿、黑屏等问题,那么,可以尝试:
首先,创建OrientationEventListener对象:
<pre class = "brush:java;" > private OrientationEventListener mOrientationListener; // screen orientation listener</pre><pre class="brush:java;">private boolean mScreenProtrait = true;
private boolean mCurrentOrient = false ;</pre>
然后,自定义屏幕变化回调接口<br>
<pre class = "brush:java;" > abstract protected void OrientationChanged( int orientation); //screen orientation change event</pre>
最后,自定义监听类<br>
<pre class = "brush:java;" > private final void startOrientationChangeListener() {
mOrientationListener = new OrientationEventListener( this ) {
@Override
public void onOrientationChanged( int rotation) {
if (((rotation >= 0 ) && (rotation <= 45 )) || (rotation >= 315 )||((rotation>= 135 )&&(rotation<= 225 ))) { //portrait
mCurrentOrient = true ;
if (mCurrentOrient!=mScreenProtrait)
{
mScreenProtrait = mCurrentOrient;
OrientationChanged(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
Log.d(TAG, "Screen orientation changed from Landscape to Portrait!" );
}
}
else if (((rotation > 45 ) && (rotation < 135 ))||((rotation> 225 )&&(rotation< 315 ))) { //landscape
mCurrentOrient = false ;
if (mCurrentOrient!=mScreenProtrait)
{
mScreenProtrait = mCurrentOrient;
OrientationChanged(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
Log.d(TAG, "Screen orientation changed from Portrait to Landscape!" );
}
}
}
};
mOrientationListener.enable();
}</pre>
在onCreate()中调用:
<pre class = "brush:java;" >startOrientationChangeListener(); </pre>
这个方法的优点:你可以任意随时准确的监听屏幕旋转变化的状态,可以随时动态改变横竖屏状态;
注:对于Camera来说,你可以设置初始化为横屏或者竖屏,然后对外提供旋转监听,这样,既可以获得屏幕旋转状态,让你做出相应的操作,又不会出现重新onCreate当前Activity造成的卡顿与短暂的黑屏切换。<br>
<br>
<p> </p>
<p> </p>
|
防止activity转屏幕后调用oncreate的方法相关推荐
- Android屏幕旋转时Activity不重新调用onCreate的方法
2019独角兽企业重金招聘Python工程师标准>>> android屏幕旋转时Activity不重新调用onCreate的方法 当手机转屏时,Activity的onDestroy和 ...
- Android的onDestroy方法,Android编程之Activity中onDestroy()调用分析
本文分析了Android编程之Activity中onDestroy()调用方法.分享给大家供大家参考,具体如下: 刚刚一个BUG让我发现,如果 activity 实现了一个回调接口,然后使用 this ...
- android 怎么调用震动,Android实现调用震动的方法
本文实例讲述了Android实现调用震动的方法.分享给大家供大家参考,具体如下: 调用Android系统的震动,只需要一个类 那就是Vibrator ,这个类在hard包中,一看系统级的服务,又要通过 ...
- 多态在android中(利用接口调用服务中方法)的应用
首先我们已经了解了java中多态的基本概念 1方法重载. 2向上转型,向下转型 今天我们主要讲向上转型在android中的应用范例. 在java中向上向下转型的图解: 重点:子类对象向上转型为父类对象 ...
- dialog 弹框时activity生命周期调用过程
dialog 弹框时activity生命周期调用过程 这个问题,分两部分 在普通activity弹框dialog,activity的onPause方法会被调用吗? activity a中给dialog ...
- android 广播震动,Android实现调用震动的方法
本文实例讲述了Android实现调用震动的方法.分享给大家供大家参考,具体如下: 调用Android系统的震动,只需要一个类 那就是Vibrator ,这个类在hard包中,一看系统级的服务,又要通过 ...
- android调用oncreate,Android - 每次启动时都会调用onCreate
当我安装我的应用程序从市场,我有时会看到以下行为: 导航离开这个程序调用的onStop,如预期 返回到应用程序调用的onCreate为主要活动,而不仅仅是重新启动/ onResume 无论如何,每次用 ...
- android 引入 .so,android studio导入so文件,并调用其中的方法
在单位的项目中,需要一个算法来计算一个特殊值,可是相关的部门却不给计算公式,只是给了几个封装好的so文件和一个.h文件,让传入几个值,然后得到相应的值.拷.....没法子,人家不给,我们只好调用这个了 ...
- ajax离开页面方法,jQuery中ajax调用当前页面方法
$.ajax({ type: 'POST', url: 'AddressManager.aspx/GetProvince',//AddressManager.aspx当前页面 data: '{cach ...
最新文章
- xp网吧用母盘制作说明
- js基础-字符串常用属性合集
- Linux SPI总线和设备驱动架构之二:SPI通用接口层
- javaWeb服务详解(含源代码,测试通过,注释) ——Dept的Service层
- flv 开源 修复_解决开源项目错误和修复的5个步骤
- 三种方法生成随机数之srand篇
- 中国首档程序员综艺:你有freebug吗?
- 19.为什么要用异步框架,它解决什么问题?
- 实验2-1-1 计算摄氏温度 (5 分)
- Cradle CFD—专业热流场分析工具
- win10易升_易升win10失败怎么办
- 全自动抠图换背景软件下载_抠图换背景app
- HTTP协议:工作原理
- 美团三面挂了....这个坑千万别踩!
- 流行音乐网站 /音乐网站
- c语言延时0.5s程序,C语言延时程序(ms,us)
- 华硕幻X GZ301VV原厂预装系统带ASUS RECOVERY
- Easyconnect For Mac 最新版 下载地址
- 探索、松散结构,和大家谈谈关于社区的思考|shadow与mixlab的故事
- 通过blacklist来禁用驱动
热门文章
- 我是一棵小草我要寻觅春天
- 河道水位监测:河道水位监测用什么设备
- 基于 DevOps 实践的 .NET Core 给开发者带来了哪些好处?
- 基于AES算法的英文文字加解密
- 人生太短,不要给自己贴上年龄标签
- 网络安全期末考试题目
- Postgresql SP-Gist索引
- 未来“智能教育”的蓝图:大规模在线教育中的知识智能
- Error creating bean with name ‘ds1-sentinel-nacos-datasource‘:
- ​金属外壳笔记本电脑会触电吗?