以下解析以Launcher2的源码为依据
<application
android:name="com.android.launcher2.LauncherApplication"
android:label="@string/application_name"
android:icon="@drawable/ic_launcher_home"
android:hardwareAccelerated="@bool/config_hardwareAccelerated"
android:largeHeap="@bool/config_largeHeap">
<activity
android:name="com.android.launcher2.Launcher"
android:launchMode="singleTask"
android:clearTaskOnLaunch="true"
android:stateNotNeeded="true"
android:theme="@style/Theme"
android:windowSoftInputMode="adjustPan"
android:screenOrientation="nosensor">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.HOME" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.MONKEY"/>
</intent-filter>
</activity>
......
manifest属性解析
1、android:hardwareAccelerated
从Android3.0 (API level11)开始,Android的2D显示管道被被设计得更加支持硬加速了.
硬加速使用GPU承担了所有在View的canvas上执行的绘制操作
启用硬加速最简单的的方法是对整个应用启用硬件速,也就是在如launcher一样在application节点下使用
在Android中,可以四给不同层次上开启硬件加速:
1)、Application
<application android:hardwareAccelerated="true">
2)、Activity
<activity android:hardwareAccelerated="true">
3)、Window `getWindow().setFlags(WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED, WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED);`
4)、View
view.setLayerType(View.LAYER_TYPE_SOFTWARE, null);
2、android:largeHeap :
用命令查看机器的内存限制,在/system/build.prop文件中:
命令如下:
adb shell
cd system
cat system/build.prop
在终端可以看到
……
dalvik.vm.heapstartsize = 128m
……
dalvik.vm.heapstartsize=8m
dalvik.vm.heapsize=256m
dalvik.vm.heaptargetutilization=0.75
dalvik.vm.heapminfree=512k
dalvik.vm.heapmaxfree=8m
……
heapgrowthlimit就是一个普通应用的内存限制,而heapsize是在manifest中设置了largeHeap=true之后,可以使用的最大内存值。
设置largeHeap的确可以增加内存的申请量。但不是系统有多少内存就可以申请多少,而是由dalvik.vm.heapsize限制。
Android官方给的建议是,作为程序员的我们应该努力减少内存的使用,想回收和复用的方法,而不是想方设法增大内存。
当内存很大的时候,每次gc的时间也会长一些,性能会下降
关于上面几个内容的详细解析可以看一下这个链接:
http://blog.csdn.net/goodlixueyong/article/details/40716779
3、android:launchMode=”singleTask”
singleTask模式是检测整个activity栈中是否存在当前需要启动的activity。
1)、在同一个app中,启动这个singleTask模式的activity,如果存在,则将该activity置于栈顶,并将该activity以上
的activity都销毁。
2)、如果是其他的程序以singleTask模式来启动这个activity,那么他将创建一个新的任务栈。
3)、如果启动的activity是singleTask模式的,且该activity已经在后台的一个栈里了,那么启动后,这个任务栈将一起
被切换到前台。
所以,这种启动模式通常可以用来退出整个应用:将主activity设为singleTask模式,然后再要退出的activity中转到主
activity,从而将主activity之上的activity都销毁,然后重写主activity的onNewIntent()方法,在该方法中用finish()结束自己
注:以上知识摘抄自《Android 群英传》
4、android:clearTaskOnLaunch=”true”
当一个应用的主activity设置这个属性之后,该应用启动,按HOME键,运行在后台的一个任务栈里的时候,
当从桌面上再次启动这个应用的时候,其余的activity会销毁,显示的页面是这个主activity
例如:A的清单文件中设置clearTaskOnLaunch=”true”, A启动B,B启动C,按home键,应用在后台运行,
这个时候,再次启动应用,则C执行 ondestory(),B执行 onDestory(),显示A界面
当长按home键,在近期启动任务中点击该app图标的时候,是回到原来定位的界面,而不是A
注:这个属性只在主activity起作用
5、android:stateNotNeeded=”true”
这个属性默认设置为false
默认的,Activity在最终被关掉之前,或按Home键的情况下,会调用onSaveInstanceState()方法来保存资源。
然后在这个Activity被重启时,再把这个Bundle对象传递给onCreate()方法。
如果这个属性设置为true,onSaveInstanceState()方法就可以不被重写,即使不保存资源,这个activity也可以快速的
重新启动,并且调用onCreate()方法时,会用null来代替Bundle对象,就像Activity被第一次重启一样。
例如,在主屏显示的Activity如果使用这个设置,即使由于某些原因导致Activity崩溃,则会快速重新启动
以上是我根据各家的理解总结的,下面是在http://www.eoeandroid.com/thread-327328-1-1.html?_dsign=44eca622
上看到的,感觉解释的比较的清楚,大家可以更好的理解
这个属性是是menifest.xml 标签的一个属性,有两个值(true或者false),
这个属性用于决定activity被杀死再重新启动是否需要保存状态。当设置true的时候,不会保存之前的状态,设置false的话,
之前的状态是必须要保存的。默认值是false。 默认情况下,也就是没有显示的设置这个属性的时候,这个值是false,
默认是要保存状态的。当Activity在被意外杀死之前,系统会回调onSaveInstanceState()这个方法,
程序员可以重写这个方法保存当前activity的一些状态到一个Bundle对象里。当这个Activity再重启的时候会通过onCreate()
方法传递过来,那个参数Bundle对象就是意外杀死前保存的状态,可以利用保存在里面的值,恢复到意外杀死前的状态。
注意一下,刚打开一个Activity时,onCreate()方法参数中的Bundle是null,做处理时要判断一下,是不是意外杀死之后的重启
正常情况下,默认值就ok了,但是有的场景需要设置为true,必须lancher程序,就是保证程序崩溃之后依然不会被系统移除,
这句话是官方文档上说的,我的理解是,用来保证肯定能重启,并且还好保证重启的速度要快,因为不需要保存状态。
6、android:windowSoftInputMode=”adjustPan”
windowSoftInputMode的值如果设置为adjustPan,那么该Activity主窗口并不调整屏幕的大小以便留出软键盘的空间
android:windowSoftInputMode = “adjustResize” ,软键盘弹出时,要对主窗口布局重新进行布局,内容调整到软键盘
以上。
在全屏模式下,adjustResize属性不起作用
7、android:screenOrientation=”nosensor”
nosensor忽略传感器,也就是重力感应等,彻底的禁止屏幕翻转