简介:这是[Android底层开发]Android开发问题集锦,介绍了和java,有关的知识、技巧、经验,和一些java源码等。
1、Android Market上发软件要注意哪些问题 很多网友可能都注册了Android Market账户,但发布一款软件如果要做到很周全需要考虑哪些问题呢? (一)、兼容性 对于目前市面上Android设备品牌种类定位繁多,这里教程之家大致将这些分为几类: (1). 按操作系统区分,Android 1.5,1.6和Android 2.0,2.1或2.2等几个版本。 (2). 按屏幕分辨率区分,目前WVGA是主流即480×800目前占了近一半,当然还有一部分HVGA的320×480大概有45%的份额,至于QVGA的一些低端机相对较少比如Moto ME511、HTC Tattoo、HTC Aria和HTC Bee这几款机型还是240×320的分辨率比较少。 (3). 硬件或扩展库,比如需要扩展包WiFi、GPS、GSM/GPRS模块、OpenGL 3D硬件加速器的。 面对上面的三种问题,这里eoe社区可以告诉大家一个简单的方法来处理比如说直接在androidmanifest.xml中设置,这样Google的Android Market就可以自适应了。面对以上问题,解决方法分别为 (1). 重新配置use-sdk节点,比如仅仅让android 2.0到2.1之间的用户使用而2.2的用户无法使用,可以设置为 其中中间数字代表API Level,而maxSdkVersion属性在较早的SDK中不支持,可能ADT无法编译通过。 (2). 分辨率我们可以添加supports-screens节点,比如兼容hvga和wvga的,可以这样写 这里small代表qvga,normal就是hvga,而large是wvga或fwvga,最后的密度还牵扯到LCD屏幕问题 (3). 扩展库,比如我们用到google maps包,或中移动的oms库,可能需要 的字样,当然硬件的问题还可以引入特性节点 比如 < android:glEsVersion=”0×00020000″> android:name=”android.hardware.camera” android:required=”true”/> 这里就是我们的游戏需要OpenGL ES 2.0的版本,如果需要2.1则值为0×00020001,需要更高的固件才能支持,同时还必须要系统的摄像头硬件。 详细的教程之家在这里给大家列出来: android.hardware.camera.autofocus android.hardware.camera.flash android.hardware.sensor.light //光线感应器 android.software.live_wallpaper //动态壁纸 android.hardware.sensor.proximity 距离感应器 android.hardware.touchscreen.multitouch //多点触控 android.hardware.telephony android.hardware.telephony.cdma android.hardware.telephony.gsm (二)、软件的隐私问题 尽量不要声明过多危险的permission,比如需要访问用户信息,联系人、短信、通话记录、定位信息等等,对于一般的程序调试反馈,Google已经在Android 2.2的固件中加入了自动反馈和自己程序的logcat stack print功能,可以在Android Market的console后台查看。
2.MATCH_PARENT是什么类型的布局 有网友表示对于很多工程中的MATCH_PARENT出现在layout中感到不明白,过去只有FILL_PARENT和WRAP_CONTENT那么 match_parent到底是什么类型呢? 其实从Android 2.2开始FILL_PARENT改名为MATCH_PARENT ,从APILevel为8开始我们可以直接用MATCH_PARENT来代替FILL_PARENT,最后教程之家提醒大家,他们的定义本质是一样均为 -1,只是换了个别名,可能为了更准确些,比如最终在SDK中的定义为: fill_parent -1 The view should be as big as its parent (minus padding). This constant is deprecated starting from API Level 8 and is replaced by match_parent. match_parent -1 The view should be as big as its parent (minus padding). Introduced in API Level 8. wrap_content -2 The view should be only big enough to enclose its content (plus padding).
3.Android换行符变成方框的解决方法 我们都知道Android是基于Linux内核的,在处理换行符时使用的是\n而Windows服务器处理换行符为\r\n这样的方式,对于显示\r 即回车符在Android上面可能就变成了黑色的方框或者说方块,我们在Android的TextView或EditView等文本显示控件上将\r\n 替换成\n即可。
4.View的显示状态GONE,VISIBLE和INVISIBLE区别 很多网友可能会发现View类的设置显示状态setVisibility方法有三种情况,分别为GONE、VISIBLE和INVISIBLE,它们之间到底有哪些区别呢? 教程之家给大家举个简单的例子。可能很多网友会发现有些Android应用的下面包含了AdMob或Adsense广告条,如果这个View 我们设置为GONE则消失,该广告条看不见也不占用位置。而INVISIBLE则代表广告条那块是空白,但仍然沾着他布局高和宽的位置,而VISIBLE 就是标准显示时的状态。
5.android单实例运行方法 我们都知道Android平台没有任务管理器,而内部App维护者一个Activity historystack来实现窗口显示和销毁,对于常规从快捷方式运行来看都是startActivity可能会使用FLAG_ACTIVITY_NEW_TASK标记来打开一个新窗口,比如Launcher,所以考虑单任务的实现方法比较简单,首先教程之家纠正下大家一种错误的方法就是直接在androidmanifest.xml的application节点中加入android:launchMode=”singleInstance”这句,其实这样将不会起到任何作用,Apps内部维护的历史栈作用于Activity,我们必须在activity节点中加入android:launchMode=”singleInstance” 这句才能保证单实例,当然一般均加在主程序启动窗口的Activity。
6.Droid2无法识别ADB问题解决方法 目前来说Motorola Droid2手机无法识别ADB,虽然通过Moto自带的驱动安装可以在Windows XP/7上安装设备驱动,但在Eclipse中可以看到DDMS的Device Manager无法识别,这问题问题以往也出现过,主要原因是你当前的ADT插件版本太低,一般Google每次推出一个高版本的固件,比如 Android 2.2则对于ADT插件也将会升级使其一些特性将支持。
7.ListView和ScrollView同时使用Bug 很多网友可能发现ListView或ScrollView这样的组件放在一起套嵌会出现无法正常显示的bug,比如典型的例子就是ScrollView 中包含的ListView只能显示2行左右,而ListView中的数据肯定远大于2个,这样的问题教程之家推荐大家可以通过重写ListView的onMeasure方法来重新设置控件的显示高度,在onMeasure中我们使用setMeasuredDimension方法重新设置控件的显示尺寸。同样对于部分网友提到的水平滚动ListView仍然适用,当然可能还有一部分网友可能使用HorizontalScrollView来实现。
8.px像素如何转为dip设备独立像素 最近有网友问如何将px像素转为dip独立设备像素,由于Android的设备分辨率众多,目前主流的为wvga,而很多老的设备为hvga甚至低端的qvga,对于兼容性来说使用dip无非是比较方便的,由于他和分辨率无关和屏幕的密度大小有关,所以推荐使用,不过这里教程之家提示大家,ophoneos的手机对于dip的支持糟糕透了,显示的结果会放大很多,同时黑色的主题会导致常规的黑色文字让用户无法分辨。 px= (int) (dip*density+0.5f) //这里eoe社区提示大家很多网友获取density的方法存在问题,从资源中获取的是静态定义的,一般为1.0对于HVGA是正好的,而对于wvga 这样的应该从WindowsManager中获取,WVGA为1.5
9.Android的Btimap处理大图片解决方法 我们都知道Android的Dalvik VM为一个应用提供了大约16MB的内存,一般我们处理超过8MB的图片将会出现OutOfMemoryError异常,我们解码一个图片为了防止内存不足的异常我们可以使用BitmapFactory.Options 的udeinTempStorage属性解决,代码如下:
BitmapFactory.Options cwj = new BitmapFactory.Options();
cwj.inTempStorage = new byte[1024*1024*5]; //5MB的临时存储空间
Bitmap bm = BitmapFactory.decodeFile(inputStream,cwj); //这里cwj为Options属性
10.android下解析xml文件遇到中文问题 很多Android开发者可能一直抱怨xml解析库不够完善,对于国内很多server并不是标准的utf-8编码,遇到中文时可能解析器会停止或解析出来的是乱码。这里教程之家给大家说下常见的解决方法: (一)、android sax库遇到gbk或gb2312编码时
方法1. 可以显示的指明编码比如: InputSource is = new InputSource(inputStream); is.setEncoding(“UTF-8″);
方法2. 使用InputStreamReader转换 在SDK中可以查看有这样实例化方法,参数二为字符集 InputStreamReader(InputStream in,Charset charset)
具体使用可以是
InputSource is=new InputSource(new InputStreamReader(inputStream,”gb2312″)); 有关InputSource的细节,我们遵循如果有字符流可用,则解析器将直接读取该流,而忽略该流中找到的任何文本编码声明。如果没有字符流,但却有字节流,则解析器将使用该字节流,从而使 用在InputSource 中指定的编码,或者另外(如果未指定编码)通过使用某种诸如 XML 规范 中的算法算法自动探测字符编码。如果既没有字符流,又没有字节流可用,则解析器将尝试打开到由系统标识符标识的资源的 URI 连接 。
|