Android重要知识点小结

1. android单实例运行方法单实例运行方法::
我们都知道Android平台没有任务管理器,而内部App维护着一个Activity history stack来实现窗口显示和销毁,对于常规从快捷方式运行来看都是startActivity可能会使用FLAG_ACTIVITY_NEW_TASK标记来打开一个新窗口,比如Launcher,所以考虑单任务的实现方法比较简单, 首先Android123纠正下大家一种错误的方法就是直接在
androidmanifest.xml的application节点中加入android:launchMode="singleInstance"这句, 其实这样将不会起到任何作用,Apps内部维护的历史栈作用于Activity,
我们必须在activity节点中加入android:launchMode="singleInstance" 这句才能保证单实例, 当然一般均加在主程序启动窗口的Activity。
 
2. px像素如何转为dip设备独立像素设备独立像素::
 
最近有网友问如何将px像素转为dip独立设备像素,由于Android的设备分辨率众多,
目前主流的为wvga,而很多老的设备为hvga甚至低端的qvga,对于兼容性来说使用dip无非是比较方便的,由于他和分辨率无关和屏幕的密度大小有关,所以推荐使用。 
px= (int) (dip*density+0.5f) //这里android开发网提示大家很多网友获取density(密度)的方法存在问题, 从资源中获取的是静态定义的,一般为1.0对于HVGA是正好的,而对于wvga这样的应该从WindowsManager中获取,WVGA为1.5 这里可以再补充一下dip,sip的知识
 
3. Android中动态改变ImageView大小
很多网友可能发现在layout.xml文件中定义了ImageView的绝对大小后,无法动态修改以后的大小显示,其实Android平台在设计UI控件时考虑到这个问题,为了适应不同的Drawable可以通过在xml的相关ImageView中加入android:scaleType="fitXY" 这行即可,但因为使用了缩放可能会造成当前UI有所变形。
使用的前提是限制ImageView所在的层,可以使用一个内嵌的方法限制显示。
 
4. 如何判断Android手机当前是否联网?
如果拟开发一个网络应用的程序,首先考虑是否接入网络,在Android手机中判断是否联网可以通过 ConnectivityManager 类的isAvailable()方法判断,
首先获取网络通讯类的实例 
ConnectivityManager cwjManager=(ConnectivityManager)getSystemService(Context.CONNECTIVITY_SERVICE);  使用cwjManager.getActiveNetworkInfo().isAvailable(); 来返回是否有效,如果为True则表示当前Android手机已经联网,可能是WiFi或GPRS、HSDPA等等,具体的可以通过ConnectivityManager 类的getActiveNetworkInfo() 方法判断详细的接入方式,需要注意的是有关调用需要加入
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"></uses-permission> 
这个权限,android开发网提醒大家在真机上Market和Browser程序都使用了这个方法,来判断是否继续,同时在一些网络超时的时候也可以检查下网络连接是否存在,以免浪费手机上的电力资源。
 
5. Drawable、Bitmap、Canvas和Paint的关系
很多网友刚刚开始学习Android平台,对于Drawable、Bitmap、Canvas和Paint它们之间的概念不是很清楚,其实它们除了Drawable外早在Sun的J2ME中就已经出现了,但是在Android平台中,Bitmap、Canvas相关的都有所变化。   
首先让我们理解下Android平台中的显示类是View,但是还提供了底层图形类android.graphics,今天所说的这些均为graphics底层图形接口。   

Bitmap - 称作位图,一般位图的文件格式后缀为bmp,当然编码器也有很多如RGB565、RGB888。作为一种逐像素的显示对象执行效率高,但是缺点也很明显存储效率低。我们理解为一种存储对象比较好。

Drawable - 作为Android平下通用的图形对象,它可以装载常用格式的图像,比如GIF、PNG、JPG,当然也支持BMP,当然还提供一些高级的可视化对象,比如渐变、图形等。   
Canvas - 名为画布,我们可以看作是一种处理过程,使用各种方法来管理Bitmap、GL或者Path路径,同时它可以配合Matrix矩阵类给图像做旋转、缩放等操作,同时Canvas类还提供了裁剪、选取等操作。    
Paint - 我们可以把它看做一个画图工具,比如画笔、画刷。他管理了每个画图工具的字体、颜色、样式。   如果涉及一些Android游戏开发、显示特效可以通过这些底层图形类来高效实现自己的应用。 

6. Activity切换导致的onCreate重复执行
 
部分网友会发现Activity在切换到后台或布局从横屏LANDSCAPE切换到PORTRAIT,会重新切换Activity会触发一次onCreate方法,
我们可以在androidmanifest.xml中的activit元素加入这个属性android:configChanges="orientation|keyboardHidden" 即可,
比如 
<activity android:name=".android123" 
android:configChanges="orientation|keyboardHidden"  android:label="@string/app_name">    
同时在Activity的Java文件中重载onConfigurationChanged(Configuration newConfig)这个方法, 这样就不会在布局切换或窗口切换时重载onCreate等方法。 代码如下: 
@Override
    public void onConfigurationChanged(Configuration newConfig)     {
        super.onConfigurationChanged(newConfig);
        if (this.getResources().getConfiguration().orientation == Configuration.ORIENTATION_LANDSCAPE)         {
         //land         }
        else if (this.getResources().getConfiguration().orientation == Configuration.ORIENTATION_PORTRAIT)        {
        //port
       }     }
 
7. Android的ImageButton问题
很多网友对Android提供的ImageButton有个疑问,当显示Drawable图片时就不会再显示文字了,
其实解决的方法有两种,第一种就是图片中就写入文字,但是这样解决会增加程序体积,同时硬编码方式会影响多国语言的发布。第二种解决方法很简单,通过分析可以看到ImageButton的layout,我们可以直接直接继承,
添加一个TextView,对齐方式为右侧即可实现ImageButton支持文字右侧显示。
8. Android代码优化技术
①Java内存控制   
对于字符串操作而言如果需要连加这样的操作建议使用StringBuilder,经过调试不难发现如果你的字符串每次连加,使用String需要的内存开销会远大于StringBuilder,然后Android手机常规的运行内存大约在128MB左右,对于运行多任务就需要考虑了,Android开发网提示因为Java有GC不需要手动释放那么分配的时候就要格外的小心,频繁的GC操作仍然是很影响性能的,在调试时我们可以通过logcat查看内存释放情况。

②循环使用   
平时在访问一个属性的时候效率远比一个固定变量低,如果你的循环估计次数常常大于5, 假设xxx.GetLength()方法的值一般大于5, 推荐这样写, 比如   
for(int i=0;i<xxx.GetLength();i++)   
这里xxx.GetLength在每次循环都要调用,必然会影响程序效率,在游戏开发中显得更为明显, 改进的方法应该为   
int j=xxx.GetLength()     for(int i=0;i<j;i++)       
③图片的优化   
在Android平台中2维图像处理库BitmapFactory做的比较智能,为了减少文件体积和效率,常常不用很多资源文件,而把很多小图片放在一个图片中,有切片的方式来完成,在J2ME中我们这样是为了将少文件头而解决MIDP这些设备的问题,而Android中虽然机型硬件配置都比较高,有关Android G1硬件配置可以参考G1手机参数以及评测,但是当资源多时这样的运行效率还是令人满意的,至少Dalvik优化的还不是很够。

猜你喜欢

转载自blog.csdn.net/qq_26280383/article/details/113941831