关于AndroidManifest中的一些配置

来源:互联网 发布:淘宝运费险如何使用 编辑:程序博客网 时间:2024/05/17 18:16

一: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进行如下设置,在自己android6.0的华为手机上,从竖屏切换到横屏,会调用onDestroy,onCreate方法。再切换会竖屏的时候不会再销毁activity了。
只有竖屏切横屏的时候才会执行销毁重新创建的过程。
<activity    android:name=".activity.common.CommonWebViewActivity"    android:configChanges="orientation"    android:screenOrientation="portrait" /><activity
关于configChanges的一些其他设置:
android:configChanges=["mcc", "mnc", "locale","touchscreen", "keyboard", "keyboardHidden","navigation", "screenLayout",
"fontScale", "uiMode","orientation", "screenSize", "smallestScreenSize"]

mcc:IMSI(国际移动用户识别码)发生改变,检测到SIM卡,或者更新MCC
mnc:IMSI网络发生改变,检测到SIM卡,或者更新MCC
其中mcc和mnc理论上不可能发生变化
locale:语言发生改变,用户选择了一个新的语言,文字应该重新显示
touchscreen:触摸屏发生改变,这通常是不应该发生的
keyboard:键盘类型发生改变,例如,用户使用了外部键盘
keyboardHidden:键盘发生改变,例如,用户使用了硬件键盘(这里说的键盘是硬键盘,自己手机里弹出的是软键盘)
navigation:导航发生改变,(这通常不应该发生) 举例:连接蓝牙键盘,连接后确实导致了navigation的类型发生变化。因为连接蓝牙键盘后,
我可以使用方向键来navigate了
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/68941263

http://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

这个属性是用来控制硬件加速的,从android3.0开始有这个属性。
可以在以下四个级别进行硬件加速控制:Application、Activity、Window、View

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中.

更多详情查看:http://blog.csdn.net/janronehoo/article/details/7517284



五:android:windowSoftInputMode

activity主窗口与软键盘的交互模式,可以用来避免输入法面板遮挡问题,Android1.5后的一个新特性。

这个属性能影响两件事情:

1、当有焦点产生时,软键盘是隐藏还是显示

2、是否减少活动主窗口大小以便腾出空间放软键盘

android:windowSoftInputMode属性值:

stateUnspecified:软键盘的状态并没有指定,系统将选择一个合适的状态或依赖于主题的设置

stateUnchanged:当这个activity出现时,软键盘将一直保持在上一个activity里的状态,无论是隐藏还是显示

stateHidden:用户选择activity时,软键盘总是被隐藏

stateAlwaysHidden:当该Activity主窗口获取焦点时,软键盘也总是被隐藏的

stateVisible:软键盘通常是可见的

stateAlwaysVisible:用户选择activity时,软键盘总是显示的状态

adjustUnspecified:默认设置,通常由系统自行决定是否调整大小

adjustResize:该Activity总是调整屏幕的大小以便留出软键盘的空间

adjustPan:当前窗口的内容将自动移动以便当前焦点从不被键盘覆盖和用户能总是看到输入内容的部分


六:android:alwaysRetainTaskState

alwaysRetainTaskState翻译过来就是“总是保留任务栈状态”,就是AndroidManifest中设置
android:alwaysRetainTaskState = true 的那个Activity所在的任务栈,在我们按下HOME键回到桌面后,
保留此任务栈的状态,当我们点击应用图片再次打开APP时,系统会判断是否已经存在以这个Activity为
根Activity的任务栈,如果有就直接使用该栈,并显示栈顶的Activity。
Activity中有一个方法,moveTaskToBack

具体详情可以查看:http://www.cnblogs.com/AndroidJotting/p/4964071.html

<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>
Task是任务栈,是用来记录Activity打开顺序、保存状态等的。
比例这里,我们在AndroidManifest中设置FrameActivity为根Activity(就是应用默认启动的Activity)。我们打开应用后就进入到FrameActivity界面,在一次打开ChatActivity、ChatSetingActivity。这个时候从栈底到栈顶一次是FrameActivity、ChatActivity、ChatSetingActivity,然后点击HOME键返回桌面,再点击APP图标回到应用,
这个时候系统就会直接使用有FrameActivity这个根Activity所在的任务栈了,并显示栈顶的Activity,也就是ChatSetingActivity。


七:android:launchMode

launchMode在多个Activity跳转的过程中扮演着重要的角色,它可以决定是否生成新的Activity实例,
是否重用已存在的Activity实例,是否和其他Activity实例公用一个task里。
具体详情查看:http://blog.csdn.net/liuhe688/article/details/6754323/

Activity一共有以下四种launchMode:

1、standard默认启动模式,每次跳转 系统都会在task中生成一个新的Activity实例,并且放于栈

结构的顶部。不管这个Activity实例在Task中是否已经存在,都创建新的实例。

2、singleTop如果发现有对应的Activity实例正位于栈顶,则重复利用,如果栈顶没有就生成新的实例。

3、singleTask 如果发现有对应的Activity实例,则使此Activity实例之上的其他Activity实例统统出栈,

是此Activity实例成为栈顶对象,显示到幕前。

4、singleInstance 会启用一个新的栈结构,将Acitvity放置于这个新的栈结构中,并保证不再有

其他Activity实例进入。




八:android:noHistory

设置 android:noHistory=true后,该Activity在statck中不留历史痕迹。默认的值是false。

举例说明,假设有三个Activity分别是:A,B,C。这三个Activity可以依次顺序启动下一个Activity,
A——> B——>C
在AndroidManifest.xml中配置B的属性为:android:noHistory=true。其他两个不做特别设置,
仅仅作为一般的Activity处理。可以观察到,A启动后,从A跳转到B,再从B跳转到C,进入C后,
此时如果按返回键,将直接进入A,而不是B。简单的跳转逻辑路线:
A –> B –> C –> 按返回键 –> A
综上,可以这么理解android:noHistory=true对Activity行为的影响:当该Activity屏幕不可见时,
相当于Android系统调用Activity的finish()方法结束了该Activity。

九:android:allowBackup

Android属性allowBackup安全风险源于adb backup容许任何一个能够打开USB 调试开关的人从Android手机中
复制应用数据到外设,一旦应用数据被备份之后,所有应用数据都可被用户读取;adb restore容许用户指定一个
恢复的数据来源(即备份的应用数据)来恢复应用程序数据的创建。因此,当一个应用数据被备份之后,用户即
可在其他Android手机或模拟器上安装同一个应用,以及通过恢复该备份的应用数据到该设备上,在该设备上打开
该应用即可恢复到被备份的应用程序的状态。
尤其是通讯录应用,一旦应用程序支持备份和恢复功能,攻击者即可通过adb backup和adb restore进行恢复新安装
的同一个应用来查看聊天记录等信息;对于支付金融类应用,攻击者可通过此来进行恶意支付、盗取存款等;因此
为了安全起见,开发者务必将allowBackup标志值设置为false来关闭应用程序的备份和恢复功能,以免造成信息泄露
和财产损失。

当allowBackup标志值为true时,即可通过adb backup和adb restore来备份和恢复应用程序数据;


adb(android debug bridge)调试桥


原创粉丝点击