android开发中,都有哪些坑需要注意

author author     2023-02-20     206

关键词:

  1、不要排斥新技术和新工具。 Android Studio 1.0 之后的版本,基本已经稳定到可以支持正常的工作开发的程度了。单纯就书写效率而言,Android Studio 带来的好处绝对大于它和Gradle的学习成本。JetBrains的IDE,用过都说好。还有就是适当的提升targetSdkVer… 显示全部
  1、不要排斥新技术和新工具。
  Android Studio 1.0 之后的版本,基本已经稳定到可以支持正常的工作开发的程度了。单纯就书写效率而言,Android Studio 带来的好处绝对大于它和Gradle的学习成本。JetBrains的IDE,用过都说好。
  还有就是适当的提升targetSdkVersion到新版本。

  2、代码设计方面的问题,大部分都能在Android系统源码里找到解决方案。
  当自己想设计一个新模块,或者实现一个新ui组件的时候,应该采用哪些设计模式、应该以哪种形式给外界提供接口之类的问题,大部分都可以参考Android系统的源码,找到实现方式。Google为安卓程序员提供了一座现成的宝库。

  3、理解Android和Java内存管理方式,至少要理解垃圾回收和Java的引用。
  就好比学OC就要先理解黄金法则一样,而java的内存管理,其实比OC要好理解多了。
  这可能会帮助大大减少程序异步操作产生的空指针崩溃。也会帮助理解为什么滥用单例模式会导致内存的臃肿。还会帮助养成不用“+”去连接超大字符串的好习惯。

  4、ContentProvider并不是只有在跨进程共享数据的才有用,把数据库表映射到一个独立的uri是Google鼓励的实现方式。
  从设计上讲,用uri(统一资源标识符)去描述数据,肯定比sql语句要理想。
  从效果上讲,用CursorLoader读取数据是让iOS程序员都羡慕不已的事情,作为android程序员,何苦不用呢。

  5、理解Activity任务栈。
  非Activity的Context对象如果直接启动Activity会报错,这只是一个表面现象,真正起作用的其实是Activity任务栈机制。
  理解Activity任务栈机制以及Activity的各种启动方式,会帮助解决大部分页面关系错乱问题,以及应用互相掉起、任务栏进入应用、后台弹窗引起的各种问题。

  6、对于一些奇葩的第三方ROM,调用其非主流api的时候,可以使用反射。
  在适配一些第三方ROM的的时候,调用一些在开发环境中没有,但在运行环境中有的方法时,可以使用反射。比方说,华为双卡手机可能会提供获取第二块SIM卡信息的api,如果直接调用,在开发环境可能无法通过正常编译,用反射就没问题。这属于不得已而用反射的一种情况。

  7、SQLite的锁,是数据库级别的锁,也就是说同一个数据库的写操作无法并发执行。
  所以,在数据库设计的时候,如果表太多,尽量将没有关联的表拆到多个数据库文件中。

  8、Bitmap的内存占用问题。
  这是一个困扰2.X时代android程序员的问题。
  2.X时代Bitmap对象虽然存储在堆内存中,但是用了一个byte数组存储其像素信息。通过计数器来记录该像素信息被引用的个数。有人认为这个byte数组在native堆中,但事实上它也在堆中。
  只有在使用者调用recycle()后,Bitmap对象才会释放像素信息,才会在失去引用后,被垃圾回收机制销毁。再加上DVM的heap size有严格的阀值,所以在使用大量图片资源的时候,及其容易发生OOM。
  解决办法一般都是,用一个哈希表存储Bitmap对象的软引用,作为内存缓存,并在适当时机掉用其recycle()。
  3.0以上版本Bitmap对象可以通过垃圾回收机制完全销毁,理论上不用再调用recycle()。
参考技术A 参考如下 1、不要排斥新技术和新工具。  Android Studio 1.0 之后的版本,基本已经稳定到可以支持正常的工作开发的程度了。单纯就书写效率而言,Android Studio 带来的好处绝对大于它和Gradle的学习成本。JetBrains的IDE,用过都说好。  还有就是适当的提升targetSdkVersion到新版本。  2、代码设计方面的问题,大部分都能在Android系统源码里找到解决方案。  当设计一个新模块,或者实现一个新ui组件的时候,应该采用哪些设计模式、应该以哪种形式给外界提供接口之类的问题,大部分都可以参考Android系统的源码,找到实现方式。Google为安卓程序员提供了一座现成的宝库。  3、理解Android和Java内存管理方式,至少要理解垃圾回收和Java的引用。  就好比学OC就要先理解黄金法则一样,而java的内存管理,其实比OC要好理解多了。  这可能会帮助大大减少程序异步操作产生的空指针崩溃。也会帮助理解为什么滥用单例模式会导致内存的臃肿。还会帮助养成不用“+”去连接超大字符串的好习惯。  4、ContentProvider并不是只有在跨进程共享数据的才有用,把数据库表映射到一个独立的uri是Google鼓励的实现方式。  从设计上讲,用uri(统一资源标识符)去描述数据,肯定比sql语句要理想。  从效果上讲,用CursorLoader读取数据是让iOS程序员都羡慕不已的事情,作为android程序员,何苦不用呢。  5、理解Activity任务栈。  非Activity的Context对象如果直接启动Activity会报错,这只是一个表面现象,真正起作用的其实是Activity任务栈机制。  理解Activity任务栈机制以及Activity的各种启动方式,会帮助解决大部分页面关系错乱问题,以及应用互相掉起、任务栏进入应用、后台弹窗引起的各种问题。  6、对于一些奇葩的第三方ROM,调用其非主流api的时候,可以使用反射。  在适配一些第三方ROM的的时候,调用一些在开发环境中没有,但在运行环境中有的方法时,可以使用反射。比方说,华为双卡手机可能会提供获取第二块SIM卡信息的api,如果直接调用,在开发环境可能无法通过正常编译,用反射就没问题。这属于不得已而用反射的一种情况。  7、SQLite的锁,是数据库级别的锁,也就是说同一个数据库的写操作无法并发执行。  所以,在数据库设计的时候,如果表太多,尽量将没有关联的表拆到多个数据库文件中。  8、Bitmap的内存占用问题。  这是一个困扰2.X时代android程序员的问题。  2.X时代Bitmap对象虽然存储在堆内存中,但是用了一个byte数组存储其像素信息。通过计数器来记录该像素信息被引用的个数。有人认为这个byte数组在native堆中,但事实上它也在堆中。  只有在使用者调用recycle()后,Bitmap对象才会释放像素信息,才会在失去引用后,被垃圾回收机制销毁。再加上DVM的heap size有严格的阀值,所以在使用大量图片资源的时候,及其容易发生OOM。  解决办法一般都是,用一个哈希表存储Bitmap对象的软引用,作为内存缓存,并在适当时机掉用其recycle()。  3.0以上版本Bitmap对象可以通过垃圾回收机制完全销毁,理论上不用再调用recycle()。 参考技术B 1. 为Activity声明系统配置变更事件
系统配置变更事件是指转屏,区域语言发生变化,屏幕尺寸发生变化等等,如果Activity没有声明处理这些事件,发生事件时,系统会把Activity杀掉然后重启,并尝试恢复状态,Activity有机会通过onSaveInstanceState()保存一些基本数据到Bundle中,然后此Bundle会在Activity的onCreate()中传递过去。虽然这貌似正常,但是这会引发问题,因为很多其他的东西比如Dialog等是要依赖于具体Activity实例的。所以这种系统默认行为通常都不是我们想要的。
为了避免这些系统默认行为,就需要为Activity声明这些配置,如下二个是每个Activity必须声明的:
<activity android:configChanges="orientation|keyboardHidden">
几乎所有的Activity都要声明如上,为什么Android不把它们变成Default的呢?
2. 尽量使用Android的API
这好像是废话,在Android上面开发不用Android API用什么?因为Android几乎支持Java SE所有的API,所以有很多地方Android API与Java SE的API会有重复的地方,比如说对于文件的操作最好使用Android里面Context封装的API,而不要直接使用File对象:
Context.openFileOutput(String); // no File file = new File(String)
原因就是API里面会考虑到Android平台本身的特性;再如,少用Thread,而多使用AsyncTask等。
3. 要考虑到Activity和进程被杀掉的情况
如了通常情况退出Activity外,还有Activity因其他原因被杀的情况,比如系统内存过低,系统配置变更,有异常等等,要考虑和测试这种情况,特别是Activity处理重要的数据时,做好的数据的保存。
4. 小心多语言
有些语言真的很啰嗦,中文或英文很简短就能表达的事情到了其他语言就变的死长死长的,所以如果是wrap_content就可能把其他控制挤出可视范围; 如果是指定长度就可能显示不全。追答

也要注意特殊语言比如那些从右向左读的语言。
5. 不要用四大组件去实现接口
一是组件的对象都比较大,实现接口比较浪费,而且让代码更不易读和理解; 另外更重要的是导致多方引用,可能会引发内存泄露。
6. 用getApplication()来取Context当参数
对于需要使用Context对象作为参数的函数,要使用getApplication()获取Context对象当参数,而不要使用this,除非你需要特定的组件实例!getApplication()返回的Context是属于Application的,它会在整个应用的生命周期内存在,远大于某个组件的生命周期,所以即使某个引用长期持有Context对象也不会引发内存泄露。
7. 主线程只做UI控制和Frameworks回调相关的事。附属线程只做费时的后台操作。交互只通过Handler。这样就可以避免大量的线程问题。
8. Frameworks的回调不要做太多事情仅做必要的初始化,其他不是很重要的事情可以放到其他线程中去做,或者用Handler Schedule到稍后再做。
9. 要考虑多分辨率
至少为hdpi, mdpi, ldpi准备图片和布局。元素的单位也尽可能的使用dip而不要用px。
10. 利用Android手机的硬键
几乎所有的Android手机都有BACK和MENU,它们的作用是返回和弹出菜单,所以就不要再在UI中设计返回按扭和菜单按扭。很多优秀的应用如随手记和微信都有返回键,他们之所以有是因为他们都是从iOS上移植过来的,为了保存体验的一致,所以也有了返回和菜单。但这不够Android化,一个纯正的Android是没有必须重复硬键的功能的。

androidwebview在开发过程中都有哪些坑

...统类的函数,进而可以进行任意代码执行。参考技术A自Android4.4起,引入了webView,使用需要注意的事项:1.多线程如果你在子线程中调用WebView的相关方法,而不在UI线程,则可能会出现无法预料的错误。所以,当你的程序中需要... 查看详情

软件外包有哪些坑要注意?

软件开发外包有哪些坑要注意?(点击链接阅读原文) 查看详情

微信小程序开发都有哪些细节需要注意

参考技术A微信小程序开发中需要注意的细节是:1、微信小程序目前只支持中文、英文、数字和加号,长度在3-20个字符之间;小程序名称一个汉字为两个字符;加号只可以放在名称的尾处,例如(xxx+);小程序发布前,可修改两次名称... 查看详情

打算使用laravel现有的数据库上做开发,会都有哪些坑

taskcopyFileToProject2(type:Copy)from(\'build/intermediates/bundles/debug/\')into("$rootProject.projectDir/sdk_demo_online/libs/")include(\'classes.jar\')rename(\'classes.jar\',\'xiaoi_sdk.jar\')参考技术Alaravel里的时间戳,实体间关系,软删除等等都比较坑 查看详情

电子邮箱申请要注意哪些坑?

电子邮箱现如今已经成为了人们生活和工作中必不可少的通讯工具,承载着生活中的点滴成长也留存着工作中的机要文件。所以在申请个人电子邮箱是一定要注意一些坑,避免为自己的生活和工作带来损失。一.邮箱容量太小,... 查看详情

android开发现状如何?都有哪些内容需要了解?涨薪小意思啦!(代码片段)

常常有⼈问我两个问题:“现在学习Android开发还有前景吗?”“Android开发还有那么吃香吗?”。这两个问题其实对应着同⼀个现象,⽆论是准备⼊⾏或刚刚⼊⾏,还是⽐较资深的开发者,对于Android开发职... 查看详情

androidapp开发流程都有哪些环节

androidapp开发流程具体步骤如下:一应用开发规划:※确定app软件功能。※必须的app应用界面及界面跳转的流程。※开发app需要的数据及数据的来源及格式。※是否需要服务端支持。※是否需要本地数据库支持。※是否需要特殊... 查看详情

android开源游戏引擎都有哪些?

参考技术AAndroid开源游戏引擎是Android游戏开发的基础,选择一个好的Android游戏开发的引擎能让更好的来开发游戏,下面就简绍几个Android开源游戏引擎。1、AngleAngle是一款专为Android平台设计的,敏捷且适合快速开发的2D游戏引擎... 查看详情

android开发地图都有哪些

Android的地图api有很多,下面就简单的说下常见的几款。百度地图:在开发中也是用的最多的。地图更新比较快,功能齐全,使用也挺简单。还有demo,文档也很丰富。高德地图:功能也很全,感觉不一样的地方就是地图加载很快... 查看详情

android开发的注意事项androidmanifest里面的那些坑

android:hardwareAccelerated=“false“属性慎用!慎用!慎用!最近对2年前的一个小项目进行二开,记录一下两天呕心沥血找BUG的心情,真是心中一万个草泥马在奔腾。原因一:就很小的一个功能,让我整了两天... 查看详情

activity设置背景透明之开发坑

...Manifest.xml中,直接在需要设置的Activity中添加主题样式:Android:theme="@android:style/Theme.Translucent"此外,可以在Activity布局文件中增加如下代码控制透明度android:background="#01000000"方法二、  1、在自己项目的style文件下  <st 查看详情

android13带来了哪些新功能?需要哪些适配工作?|开发者说·dtalk

...:BennuC,原文发布于:BennuCTech前言目前Google已经发布了Android13的正式版,虽然国内的手机能用上Android13还有一段时间,不过开发者们可以通过模拟器来体验,那么我们来看看Android13都有哪些重要的改变,我们适... 查看详情

java多线程并发编程-避坑指南

...基于编码规范、工作中积累的研发经验等,整理在多线程开发的过程中需要注意的部分,比如不考虑线程池参数、线程安全、死锁等问题,将会存在潜在极大的风险。并且对其进行根因分析,避免每天踩一坑,坑坑不一样。作者... 查看详情

java学习都有哪些重点和难点

 Java学习第一个重点难点——JDK开发环境安装首先是Java开发环境的各种版本选择,一般情况下我们需要从JDK官网下载最新版本的JDK文件(但是还需要注意你所学习的图书或者视频使用的是哪个版本的JDK),根据自己电脑的系统... 查看详情

android软件开发工程师日常主要工作都有哪些?

Android工程师是指从事Android移动应用操作系统、游戏和各种Android平台功能的应用、开发和测试的技术人员。他的日常主要工作有:1、Android体系结构和开发环境2、Android开发原理和项目介绍3、Android核心组件4、AndroidUI设计5、Android... 查看详情

谁能说一下在qt中使用多线程都有哪些需要注意的事项呢?

在Qt中使用多线程,目前就我使用过的有两种,一是子类化QThread,重写run函数,在run函数里实现自己的代码,这一部分代码通常是比较耗时,或者干脆直接阻塞的。比如一个while循环,设置一个标志,判断循环结束。这样的例子... 查看详情

发布android工程师岗位职责都有哪些

...你们公司的业务需求的:给你个参考1:岗位职责:1.负责Android平台应用程序的设计与开发;2.参与移动平台软件框架的研究,设计和实现、关键技术验证和选型等工作;3.完成核心模块的详细设计及编码工作,并能指导开发工程... 查看详情

手机app开发工具都有哪些快速编写代码

...的主流开发工具。首先,APP开发包括几个平台,IOS开发、Android开发、windows开发,IPad开发等,不同的平台应用软件开发有不同的app开发工具。BiznessApps软件开发工具:BiznessApps软件开发工具这是一块专门为中小企业提供的一个快... 查看详情