一:android:configChanges = " orientation | keyboardHidden | screenSize"
android:configChanges="orientation" 这个属性指定了要捕获“屏幕方向”变化这个行为,当捕获这个行为后就会调用Activity的
onConfigurationChanged()方法。然而当我们在手机上调试的时候就会发现,其实并没有执行onConfigurationChanged()这个方法,
依旧销毁当前Activity并创建新的Activity实例。
这是因为android:configChanges只设置了"orientation" 这一个属性,这样做在低版本上是可以起到作用的,但是在android 4.0 以上
就不起作用,还要加上"screenSize",才能起效果。
默认情况,当“屏幕方向”或“键盘显示隐藏”变化时都会销毁当前Activity,创建新的Activity。如果不希望重新创建Activity实例,可以按如下在AndroidManifest.xml中配置Activity:
<activity android:name=".activity.webview.WebViewActivity" android:configChanges="orientation|screenSize|keyboardHidden"></activity>
<activity android:name=".activity.common.CommonWebViewActivity" android:configChanges="orientation" android:screenOrientation="portrait" /> <activity
mcc:IMSI(国际移动用户识别码)发生改变,检测到SIM卡,或者更新MCC
mnc:IMSI网络发生改变,检测到SIM卡,或者更新MCC
其中mcc和mnc理论上不可能发生变化
locale:语言发生改变,用户选择了一个新的语言,文字应该重新显示
touchscreen:触摸屏发生改变,这通常是不应该发生的
keyboard:键盘类型发生改变,例如,用户使用了外部键盘
keyboardHidden:键盘发生改变,例如,用户使用了硬件键盘(这里说的键盘是硬键盘,自己手机里弹出的是软键盘)
navigation:导航发生改变,(这通常不应该发生) 举例:连接蓝牙键盘,连接后确实导致了navigation的类型发生变化。因为连接蓝牙键盘后,
screenLayout:屏幕的布局发生改变,这可能导致激活不同的显示
fontScale:全局字体大小缩放发生改变
orientation:设备旋转,横向显示和竖向显示模式切换。
screenSize: 屏幕大小改变了
smallestScreenSize: 屏幕的物理大小改变了,如:连接到一个外部的屏幕上
二:android:screenOrientation
一般用户可以自己设置手机的横竖屏切换,只要点击自己手机的“屏幕旋转”就可以了。但是这个操作更改的是自己整个手机的横竖屏切换。当手机没有关闭横竖屏切换
功能时,系统一旦触发横竖屏切换,缺省状态下,当前活动的App的界面就会进行横竖屏切换,由于横竖屏的界面尺寸等参数不同,很多软件在设计和开发中为了避免横竖屏
切换时引发不必要的麻烦,通常需要让App禁止掉横竖屏的切换,这就需要通过在AndroidManifest.xml中设置activity中的android:screenOrientation属性值来实现。
该android:screenOrientation属性,他有以下几个参数:
"unspecified":默认值 由系统来判断显示方向.判定的策略是和设备相关的,所以不同的设备会有不同的显示方向.
"landscape":横屏显示(宽比高要长)
"portrait":竖屏显示(高比宽要长)
"user":用户当前首选的方向
"behind":和该Activity下面的那个Activity的方向一致(在Activity堆栈中的)
"sensor":有物理的感应器来决定。如果用户旋转设备这屏幕会横竖屏切换。
"nosensor":忽略物理感应器,这样就不会随着用户旋转设备而更改了("unspecified"设置除外)。
比如下列设置
android:screenOrientation="portrait"
则无论手机如何变动,拥有这个属性的activity都将是竖屏显示。
android:screenOrientation="landscape",为横屏显示。
上述修改也可以在Java代码中通过类似如下代码来设置
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE),如果你在自己的java代码中通过setRequestedOrientation来设置
横竖屏切换了,那么你在AndroidManifest中设置的android:screenOrientation属性就没有用了
更多关于横竖屏的知识:
http://blog.csdn.net/wenzhi20102321/article/details/68941263http://blog.csdn.net/wenzhi20102321/article/details/68941263
三:android:exported
android:exported 是Android的四大组件 Activity,Service,Provider,Receiver 都会有的一个属性。
总体来说它的主要作用是:是否支持其它应用调用当前组件。
默认值:如果包含有intent-filter 默认值为true; 没有intent-filter默认值为false。
在Activity中该属性用来标示:当前Activity是否可以被另一个Application的组件启动:true允许被启动;false不允许被启动。
如果被设置为了false,那么这个Activity将只会被当前Application或者拥有同样user ID的Application的组件调用。
exported 的默认值根据Activity中是否有intent filter 来定。没有任何的filter意味着这个Activity只有在详细的描述了他的class name后
才能被唤醒 .这意味着这个Activity只能在应用内部使用,因为其它application并不知道这个class的存在。所以在这种情况下,它的默认
值是false。从另一方面讲,如果Activity里面至少有一个filter的话,意味着这个Activity可以被其它应用从外部唤起,这个时候它的默认值
是true。
其实,不只有这个属性可以指定Activity是否暴露给其它应用,也可以使用permission来限制外部实体唤醒当前Activity
四:android:hardwareAccelerated
Application级(针对整个应用的)
在AndroidManifest文件中,把以下属性添加到<application>标签来对你的整个应用启用硬加速:
<applicationandroid:hardwareAccelerated="true" ...>
Activity级
如果你的应用在全局启用硬加速时行为不正确,你可以对个别Activities单独启用硬加速.欲在actvity级别启用或禁止硬加速,
你可以对<activity>元素使用android:hardwareAccelerated属性.
下面的例子在整个应用中启用了硬加速但对一个activity禁止了硬加速:
<application android:hardwareAccelerated="true">
<activity... />
<activity android:hardwareAccelerated="false" />
</application>
Window级
如果你需要更高颗粒度的控制,你可以使用以下代码为一个window启用硬加速:
getWindow().setFlags(WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED,WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED);
注:现在你还不能在window级别禁止硬加速.
View级
你可以在运行时使用以下代码禁止个别的View的硬加速:
myView.setLayerType(View.LAYER_TYPE_SOFTWARE,null);
注:当前你不能在View级别启用硬加速.View层有除禁止硬加速之外的其它功能.
判定一个View是否能被硬加速
有时一个应用了解是否启用了硬件加速是很有用的,对那些自定义View之类的东西尤其重要.在你的应用做了一些不被最新的管线
所支持的自定义绘制时这更加重要.
有两种方法可以检查应用是否被硬加速:
View.isHardwareAccelerated():如果View附加到一个硬加速的window上就返回true.
Canvas.isHardwareAccelerated():如果Canvas被硬加速了就返回true.
如果你必须在你的绘制代码中做这个,应使用Canvas.isHardwareAccelerated()而不是View.isHardwareAccelerated().
当一个view附加到一个硬加速的window上,它仍可以使用非硬件速的Canvas进行绘制操作.
比如当为了高速缓存而把一个view画到一个bitmap中.
五:android:windowSoftInputMode
这个属性能影响两件事情:
1、当有焦点产生时,软键盘是隐藏还是显示
2、是否减少活动主窗口大小以便腾出空间放软键盘
android:windowSoftInputMode属性值:
stateUnspecified:软键盘的状态并没有指定,系统将选择一个合适的状态或依赖于主题的设置
stateUnchanged:当这个activity出现时,软键盘将一直保持在上一个activity里的状态,无论是隐藏还是显示
stateHidden:用户选择activity时,软键盘总是被隐藏
stateAlwaysHidden:当该Activity主窗口获取焦点时,软键盘也总是被隐藏的
stateVisible:软键盘通常是可见的
stateAlwaysVisible:用户选择activity时,软键盘总是显示的状态
adjustUnspecified:默认设置,通常由系统自行决定是否调整大小
adjustResize:该Activity总是调整屏幕的大小以便留出软键盘的空间
adjustPan:当前窗口的内容将自动移动以便当前焦点从不被键盘覆盖和用户能总是看到输入内容的部分
六:android:alwaysRetainTaskState
<activity android:name=".activity.frame.FrameActivity" android:alwaysRetainTaskState="true" android:configChanges="orientation|keyboardHidden" android:exported="false" android:launchMode="singleTask" android:screenOrientation="portrait" android:windowSoftInputMode="adjustPan"></activity>
七:android:launchMode
Activity一共有以下四种launchMode:
1、standard默认启动模式,每次跳转 系统都会在task中生成一个新的Activity实例,并且放于栈
结构的顶部。不管这个Activity实例在Task中是否已经存在,都创建新的实例。
2、singleTop如果发现有对应的Activity实例正位于栈顶,则重复利用,如果栈顶没有就生成新的实例。
3、singleTask 如果发现有对应的Activity实例,则使此Activity实例之上的其他Activity实例统统出栈,
是此Activity实例成为栈顶对象,显示到幕前。
4、singleInstance 会启用一个新的栈结构,将Acitvity放置于这个新的栈结构中,并保证不再有
其他Activity实例进入。
八:android:noHistory
举例说明,假设有三个Activity分别是:A,B,C。这三个Activity可以依次顺序启动下一个Activity,
综上,可以这么理解android:noHistory=true对Activity行为的影响:当该Activity屏幕不可见时,
九:android:allowBackup
尤其是通讯录应用,一旦应用程序支持备份和恢复功能,攻击者即可通过adb backup和adb restore进行恢复新安装