一份合格的代码不该只知足于实现功能, 更应该遵循良好的规范. 遵循良好的代码规范有利于:java
这里梳理一下Android开发过程当中须要注意的一些地方, 包括多个部分, 另外根据约束力强弱分为两类:android
下面是规范正文git
这一部分是项目整体上的要求, 包括 系统设计, 命名方式, 可见性, 注释, 代码风格 等几部分.算法
include/merge
;Activity
内多Fragment
之间的直接沟通, 必须经过Activity
中转;Kotlin
语言;LoginActivity/LoginPreenter/LoginHttpRequest/LoginBean/LoginAdapter
等所属同一登陆模块的文件放入一个文件夹, 而不是全部activity
放入一个文件夹, 全部adapter
放入一个文件夹.LoginActivity.kt, NewsAdapter.kt, NewsBean.java
;login_activity.xml, login_logo.png
;class LoginPresenter {}, class NewsBean {}
;LoginPresenter loginPresenter, NewsBean newsBean
;public static final boolean IS_RELESAE = true
;android:id="@+id/tvLogin"
文件/资源命名时采用 模块+类型 的方式, 以便迅速查找相关内容, 例如登陆页面: LoginActivity.kt, login_activity.xml, login_logo.png, <string name="login_net_error">网络错误</string>, <color name="login_page_backgroud">#f3f3f3</color>
数据库
java使用的布局中的id名建议使用小驼峰方式, 而且使用控件类型缩写开头, 例: android:id="@+id/tvLogin"
, 附录经常使用控件缩写:json
控件 | 缩写 |
---|---|
LinearLayout | ll |
RelativeLayout | rl |
ConstraintLayout | cl |
ListView | lv |
ScollView | sv |
TextView | tv |
Button | btn |
ImageView | iv |
CheckBox | cb |
RadioButton | rb |
EditText | et |
private
, 只有在其余类须要引用时再看状况标为public, protected, package-private
;final
关键字;/** * Created by XXX on 2019/6/19. * 描述此类做用, 逻辑复杂的说明一下主要思路 */
public class LoginPresenter {
/** * 用于进行网络请求 * @params xxx XXX */
public void doLoginRequest(...){}
}
复制代码
@params, @return
的参数描述错误的状况, 必须实时更新;/* */
的方式;@Nullable, @NotNull, @UiThread
等注解;此git目录下同时存有 AndroidCodeStyleSetting.jar
配置文件, 用于AndroidStudio导入后按照统一风格进行代码的格式化.缓存
若是没有编写代码时随时格式化代码的习惯, 能够在AndroidStudio
版本控制提交窗口右侧Before Commit
中勾选Reformat code
选项.安全
主要包括 基本组件, UI/布局, 进程/线程/消息推送, 文件/数据库, 图片/动画, 安全性等几个部分.服务器
if (getPackageManager().resolveActivity(intent, PackageManager.MATCH_DEFAULT_ ONLY) != null)
;LocalBroadcastManager.getInstance(this).sendBroadcast(intent)
, 不容许 context.sendBroadcast(intent)
, 避免外部应用拦截;Application
中缓存数据, 全局的共享数据可使用某presenter
存储, 或者使用SharedPreference
读写;Activity
或者Fragment
中动态注册BroadCastReceiver
时,registerReceiver
和unregisterReceiver
必需要成对出现;Activity#onPause/onStop
中结合isFinishing
的判断来执行资源的释放, 必免放在执行时机较晚的Activity#onDestroy()
中执行;Activity#onPause
中执行耗时操做, 这样会致使界面跳转卡顿, 能够放入Activity#onStop
中执行;ConstraintLayout
, 能够保证无嵌套的状况下完成包括部分控件同时显隐需求在内的99%的布局要求;ScrollView
包裹ListView/GridView/ExpandableListVIew
等列表View, 复杂多项式列表可使用多ItemType
进行处理;Activity
中显示对话框或弹出浮层时, 尽可能使用DialogFragment
, 而非Dialog/AlertDialog
, 便于随Activity
生命周期管理弹窗的生命周期;Application
中的初始化代码要根据进程分别处理, 避免初始化没必要要的业务;new Thread()
的方式;Activity/Fragment
中使用Handler
时, 必须使用静态内部类+WeakReferences方式或者在onStop
中调用handler.removeCallbacksAndMessages
;ContentProvider
替代SharedPreferences#MODE_MULTI_PROCESS
;android.os.Environment#getExternalStorageDirectory(), Context#getFilesDir()
, 错误示例: File file = new File("/mnt/sdcard/Download/Album", name)
;Environment.MEDIA_MOUNTED.equals(Environment.getExternalStorageState())
;Cursor
使用以后必须关闭, 以避免内存泄漏;SharedPreference
仅存储简单数据类型, 不要存储复杂数据, 如json数据/Bitmap编码等;SharedPreference
提交数据时, 尽可能使用Editor#apply()
, 而非Editor#commit()
;Activity.onPause()/onStop()
中关闭当前activity
正在执行的动画;AnimationDrawable
, 占用很是多内存;ARGB_565
代替ARGB_888
, 减小内存占用;Animation
执行结束时, 调用View.clearAnimation()
释放相关资源;AES/DES/DESede
加密算法时, 不要使用默认的加密模式ECB
, 应显示指定使用CBC/CFB
加密模式;android:debuggable
为false;X509TrustManager
子类中的checkServerTrusted
函数效验服务器端证书的合法性,android:allowbackup
属性设置为false
, 防止adb backup
导出应用数据;