1、屏幕适配。(网上讲的最多的就是这个。) 由于Android碎片化严重,导致开发中一套代码在不同手机上运行起来效果不是很好,兼容性不是很好,这就需要对不同分辨率,不同屏幕大小的手机做屏幕适配。
具体讲解请看链接: https://www.jianshu.com/p/7aa34434ad4d2、版本适配。 不同的系统版本api有所变更,既要适配高版本,也要做到兼容低版本。
具体讲解请看链接: http://www.jianshu.com/p/49fa8ebc0105
3、ROM适配。(这个是最难的,工作量也是最大的,如果没有不同版本手机适配的积累,遇到问题都不知道怎么解决。) 由于Android是开源的,不同的手机厂商有自己定制的ROM,对系统的api可能有变更,也有可能新增一些api,所以在开发中,要针对不同厂商的手机做一些特殊适配。
具体讲解请看链接: http://www.jianshu.com/p/f9c67a4b908e
可以说小米手机对android系统定制得让人头痛,好好的应用跑在小米手机上多多少少会点问题。
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//防止重复创建的问题,第一次安装完成启动,和home键退出点击launcher icon启动会重复
if (!isTaskRoot()
&& getIntent().hasCategory(Intent.CATEGORY_LAUNCHER)
&& getIntent().getAction() != null
&& getIntent().getAction().equals(Intent.ACTION_MAIN)) {
finish();
return;
}
}
Toast不显示
也是偶然发现在荣耀8机型上后台应用的toast不会被显示出来,只能当前在前台的应用TOAST提示。
解决方案:替换toast显示,改用其他方式,如dialog或者弹出activity界面。
多网络下指定网络不成功
简单讲就是指wifi和移动网络同时开着的情况下,不能指定移动网络访问,详见接受说明移步到我的另一篇文章:http://blog.csdn.net/u010019468/article/details/72886859
receiver查询不到
在错误日志中发现金立某些手机尽然对manfiest中组件receiver配置按Interfiter过滤查询结果显示没有找到改组件,这导致发现好多配置错误而导致功能失败,其实实际是存在。后来发现只要改变一个参数flag,且是被系统不推荐使用的参数配置,就没有问题了。
解决方案如下查询receiver是否配置,flag配置成其他的就不行。
List lists = manager.queryBroadcastReceivers(intent,
PackageManager.GET_DISABLED_COMPONENTS);
在Android 6.0之后新增了权限管理,google这样设计初衷是好的,但是万恶的厂商总喜欢擅自修改定制系统,导致留下一些头疼的适配问题给广大的Android 开发者,下面就讲讲权限适配时出现的问题。
<uses-permission android:name="android.permission.CHANGE_NETWORK_STATE"/>
这个权限按照系统权限组分组在非危险权限组中,按照Android权限管理的意思,只要在Manifest中配置下就可以了,然而在实际使用中却发现在机型中出现了适配问题。
如华为6.0系统手机
java.lang.SecurityException: cn.com.chinatelecom.account.demo was not granted either of these permissions: android.permission.CHANGE_NETWORK_STATE.
只要在app中build.gradle中把 targetSdkVersion >=23就会出现这样的问题
targetSdkVersion 23
若要暂时性的解决这个问题就把targetSdkVersion <=22即可。
但是这个反应了一种不合理,不按常理情况下,就一波草泥马在心中狂奔。
作为Android开发者,当你需要将产品在某某品牌的某某机型上进行兼容性适配的时候,最为基础的适配方法是通过代码层面区分适配机型来为程序进行针对性的改变程序执行流向。
1. Build类包含的信息
Android Build类可以从系统属性中提取设备硬件和版本信息,主要功能:
主要读取的是手机系统\system\build.prop(Galaxy Nexus为例)
2. Build工作原理
厂商/品牌/机型/主板型号/CPU指令集···········
Build类的记录的设备信息主要是调用SystemProperties类的get()方法,SystemProperties的实现主要由JNI接口实现。
android.os.SystemProperties此类未开放(未提供给SDK API),能够在frameworks和android自带的APP里使用(比如Settings app里),不能被其他app直接使用,只能通过Build等类来使用.
相当于windows的注册表,由key和value组成,且都是核心系统的一个基本机制。
Android 的系统属性包括两部分:文件保存的持久属性和每次开机导入的cache属性。前者主要保存在下面几个文件中(目录下),后者则通过API方式使用。
/default.prop
/system/build.prop
/system/default.prop
/data/local.prop
/data/property目录下的所有presist属性(以presist.开头)
JNI接口:在android_os_SystemProperties.cpp定义,在frameworks/base/core/jni/AndroidRuntime.cpp中注册JNI。
3. 部分已知适配问题
由于Android系统的开放性,各大OEM厂商会以Android为基础为手机开发自己的ROM,上面的程序片段通过判断厂商和机型的方式来进行代码层面的适配,理论上这里不会有问题发生,但实际上获取厂商信息和机型信息的时候会出现你想像不到情况发生:
情况一:厂商信息获取不唯一
摩托罗拉的厂商信息不仅是”motorola”还有”mot”和”FIH”;
索爱的厂商信息不仅是”Sony”还有”Sony Ericsson”;
HTC的厂商信息不仅是”HTC”还有”HUN”;
OPPO的厂商信息不仅是”OPPO”还有”alps”;
酷派的厂商信息不仅是”CoolPad”还有”YuLong”;
…..
情况二:机型信息获取比较奇葩
红米model值为数字,model值为“2013022”的奇葩字符串。
…..
情况三:厂商信息或机型信息获取为unknown
联想A60获取厂商信息为unknown;造成这种问题的原因是厂商随意改动framework层导致的。
4. 适配建议
根据以上情况希望可以为Android开发者同学在适配工作中提供一定的借鉴和帮助。
我们给出的第一种解决方案是“规避已知问题”。例如,厂商信息不唯一时,我们就搜罗该厂商信息的所有可能,从而进行准确的判断,如下:
当获取机型信息为unknown时,我们还可以通过手机设备的其他信息来判断手机具体机型,如下:
第二种解决方案,也是最理想的解决方案“设备数据匹配”。大家都知道,从android.os.build类中,我们可以获取到很多设备的信息,既然一个机型的设备是一样的,我们可以统计所有机型的设备信息得到一个数据库,当机型获取为unknown时,通过已知信息匹配,得到达到一定匹配率的机型(90%或者更高),就可以认为匹配成功。