android中一些容易让人模糊的重要的知识点1
2012-05-24 09:52
281 查看
标注:这大部分是从网上摘录总结,很多都是从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及时回收。
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及时回收。
相关文章推荐
- Android开发网上的一些重要知识点_2
- 【android】android开发网上一些重要的知识点
- Android开发网上的一些重要知识点_3
- Android开发网上的一些重要知识点
- Android开发网上的一些重要知识点_4
- Android开发网上的一些重要知识点
- Android开发网上的一些重要知识点(1)
- Android开发网上的一些重要知识点
- Android开发网上的一些重要知识点 [1]
- Android开发网上的一些重要知识点(2)
- Android开发网上的一些重要知识点
- Android开发网上的一些重要知识点 [2]
- Android开发网上的一些重要知识点
- 转载- Android开发网上的一些重要知识点
- Android开发网上的一些重要知识点 [3]
- Android开发网上的一些重要知识点【1】
- android网上的一些重要知识点
- 转载-Android开发网上的一些重要知识点3
- Android开发网上的一些重要知识点 [4]
- Android开发网上的一些重要知识点