android中一些容易让人模糊的重要的知识点1

Android开发技巧汇总
本文介绍了Android开发中的实用技巧,包括单实例运行方法、px转dip、判断手机联网状态、图形绘制组件的理解、Activity切换优化、ImageButton使用技巧及代码优化技术。

标注:这大部分是从网上摘录总结,很多都是从android123上看得。其中也有我本人的一些经验分享,如有不妥敬请指正

1. android单实例运行方法

我们都知道Android平台没有任务管理器,而内部App维护者一个Activity history stack来实现窗口显示和销毁,对于常规从快捷方式运行来看都是startActivity可能会使用FLAG_ACTIVITY_NEW_TASK标记来打开一个新窗口,比如Launcher,所以考虑单任务的实现方法比较简单,首先纠正下大家一种错误的方法就是直接在androidmanifest.xml的application节点中加入android:launchMode="singleInstance"这句,其实这样将不会起到任何作用,Apps内部维护的历史栈作用于Activity,我们必须在activity节点中加入android:launchMode="singleInstance" 这句才能保证单实例,当然一般均加在主程序启动窗口的Activity。
2. px像素如何转为dip设备独立像素
最近有网友问如何将px像素转为dip独立设备像素,由于Android的设备分辨率众多, 对于兼容性来说使用dip无非是比较方便的,由于他和分辨率无关和屏幕的密度大小有关,所以推荐使用。  
public static int dp2px(Context context, float dipValue){ 
final  float scale = context.getResources().getDisplayMetrics().density; 
return (int)(dipValue * scale + 0.5f); 
}


3. 如何判断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> 这个权限,
提醒大家在真机上Market和Browser程序都使用了这个方法,来判断是否继续,同时在一些网络超时的时候也可以检查下网络连接是否存在,以免浪费手机上的电力资源。
4. 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游戏开发、显示特效可以通过这些底层图形类来高效实现自己的应用。 
5. Activity切换导致的onCreate重复执行
部分网友会发现Activity在切换到后台或布局从横屏LANDSCAPE切换到PORTRAIT,会重新切换Activity会触发一次onCreate方法,
我们可以在androidmanifest.xml中的activit元素加入这个属性android:configChanges="orientation|keyboardHidden" 即可,
同时在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
     }
    }
 6. Android的ImageButton问题
很多网友对Android提供的ImageButton有个疑问,当显示Drawable图片时就不会再显示文字了
,其实解决的方法有两种,
第一种就是图片中就写入文字,但是这样解决会增加程序体积,同时硬编码方式会影响多国语言的发布。
第二种解决方法很简单,通过分析可以看到ImageButton的layout,我们可以直接直接继承,添加一个TextView,对齐方式为右侧即可实现ImageButton支持文字右侧显示。
7.Android代码优化技术
1.Java内存控制   
对于字符串操作而言如果需要连加这样的操作建议使用StringBuilder,经过调试不难发现如果你的字符串每次连加,
使用String需要的内存开销会远大于StringBuilder,然后Android手机常规的运行内存大约在128MB左右,对于运行多任务就需要考虑了,
Android开发网提示因为Java有GC不需要手动释放那么分配的时候就要格外的小心,频繁的GC操作仍然是很影响性能的,在调试时我们可以通过logcat查看内存释放情况。
2.循环使用  
平时在访问一个属性的时候效率远比一个固定变量低,如果你的循环估计次数常常大于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++)   
3.图片的优化   
在Android平台中2维图像处理库BitmapFactory做的比较智能,为了减少文件体积和效率,常常不用很多资源文件,而把很多小图片放在一个图片中,
有切片的方式来完成,对于不在使用的bitmap及时回收。



 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值