阿里巴巴开发者手册学习笔记

命名规范:

1.【推荐】资源文件需带模块前缀。 特别是插件化

// Login 组件的 build.gradle
android {
    resourcePrefix "login_"
    // 其他配置 ...
}

2.【推荐】layout 文件的命名方式。

    Activity 的 layout 以 module_activity 开头

    Fragment 的 layout 以 module_fragment 开头

    Dialog 的 layout 以 module_dialog 开头

    include 的 layout 以 module_include 开头

    ListView 的行 layout 以 module_list_item 开头

    RecyclerView 的 item layout 以 module_recycle_item 开头

    GridView 的行 layout 以 module_grid_item 开头

3.【推荐】drawable 资源名称以小写单词+下划线的方式命名,

module_login_btn_pressed,module_tabs_icon_home_normal

4.【推荐】anim 资源名称以小写单词+下划线的方式命名,采用以下规则:

module_fade_in ,module_fade_out ,

5.【推荐】color 资源使用#AARRGGBB 格式,写入 module_colors.xml 文件中,命名格式采用以下规则:

模块名_逻辑名称_颜色

    如:#33b5e5e5

6.【推荐】dimen 资源以小写单词+下划线方式命名,写入 module_dimens.xml 文件中,采用以下规则:

模块名_描述信息

7.【推荐】style 资源采用小写单词+下划线方式命名,写入 module_styles.xml 文件中,采用以下规则:

父 style 名称.当前 style 名称

8.【推荐】string资源文件或者文本用到字符需要全部写入 module_strings.xml文件中,字符串以小写单词+下划线的方式命名,采用以下规则:

 模块名_逻辑名称

    如:moudule_login_tips,module_homepage_notice_desc

10.【推荐】大分辨率图片(单维度超过 1000)大分辨率图片建议统一放在 xxhdpi 目录下管理,否则将导致占用内存成倍数增加。

代码开发:

1,大的资源文件,或者对象,数据量大的,用eventbus,避免使用 Intent + Parcelable

2,避免在 Service#onStartCommand()/onBind()方法中执行耗时操作,BroadcastReceiver#onReceive()方法耗时超过 10 秒钟,可能会被系统杀死。

3,持久化存储应该在 Activity#onPause()/onStop()中实行,onSaveInstanceState()方法不是 Activity 生命周期方法,也不保证一定会被调用,他只是一个临时的,在app温启动的时候会有这种现象。

4,避免使用隐式广播,

 通过 Context#sendBroadcast()发送的隐式广播会被所有感兴趣的 receiver 接收,恶意应用注册监听该广播的 receiver 可能会获取到 Intent 中传递的敏感信息,并进行其他危险操作。如果发送的广播为使用 Context#sendOrderedBroadcast()方法发送的有序广播,优先级较高的恶意 receiver 可能直接丢弃该广播,造成服务不可用,或者向广播结果塞入恶意数据。

5,能用本地广播就用本地广播,安全。技术那好隐士广播以及全广播造成的影响。

6,【推荐】添 加 Fragment 时 , 确 保 FragmentTransaction#commit() 在Activity#onPostResume()或者 FragmentActivity#onResumeFragments()内调用。不要随意使用 FragmentTransaction#commitAllowingStateLoss()来代替,任何commitAllowingStateLoss()的使用必须经过 code review,确保无负面影响。

    说明:

    Activity 可 能 因 为 各 种 原 因 被 销 毁 , Android 支 持 页 面 被 销 毁 前 通 过Activity#onSaveInstanceState() 保 存 自 己 的 状 态 。 但 如 果FragmentTransaction.commit()发生在 Activity 状态保存之后,就会导致 Activity 重建、恢复状态时无法还原页面状态,从而可能出错。为了避免给用户造成不好的体验,系统会抛出 IllegalStateExceptionStateLoss 异常。推荐的做法是在 Activity 的onPostResume() 或 onResumeFragments() ( 对 FragmentActivity ) 里 执 行FragmentTransaction.commit(),如有必要也可在 onCreate()里执行。不要随意改用FragmentTransaction.commitAllowingStateLoss() 或 者 直 接 使 用 try-catch 避 免crash,这不是问题的根本解决之道,当且仅当你确认 Activity 重建、恢复状态时,本次 commit 丢失不会造成影响时才可这么做。

7,不在ondestory(这里的执行周期比较晚)进行资源的释放,在onpause 或者onstop结合isfinishing做一层判断

8,避免使用嵌套的 Fragment。

1) onActivityResult()方法的处理错乱,内嵌的 Fragment 可能收不到该方法的回调,需要由宿主 Fragment 进行转发处理;

 2) 被继承的 setRetainInstance(),导致在 Fragment 重建时多次触发不必要的逻辑。

3,会出现突变动画

9,Service 需要以多线程来并发处理多个启动请求,建议使用 IntentService,可避免各种复杂的设置

10【推荐】当前 Activity的 onPause方法执行结束后才会执行下一个 Activity的 onCreate方法,所以在 onPause 方法中不适合做耗时较长的工作,这会影响到页面之间的跳转效率。

11,使用一个全局的toast,避免连续的toast导致多个toast迭

UI布局篇

1.【强制】布局中不得不使用 ViewGroup 多重嵌套时,不要使用 LinearLayout 嵌套,改用 RelativeLayout,可以有效降低嵌套数,扁平化的好处。

说明:简单的来说,每次view的绘制都需要走三个步骤,测量定位绘制,从xmllayout的顶部节点开始测量,然后每个子节点按照父节点提供的大小来确定自己的位置,这个过程还要进行测量,如果嵌套的层级越多,计算就越耗时。可以用 Android Studio Monitor里的 Hierarachy Viewer 工具,可视化的查看所有的 view。

2.【推荐】在 Activity 中显示对话框或弹出浮层时,尽量使用 DialogFragment,而非Dialog/AlertDialog,这样便于随Activity生命周期管理对话框/弹出浮层的生命周期。

3,textView设置字体大小用dp不用sp

4,减少过度绘制,父view背景全覆盖就子view透明,子view多个颜色同时可以覆盖则父view不需要。

5,推荐布局 fraglayout linerlayout relativelayout,merge viewstub

6,不使用animationdrawable 不在activity没有显示全时调用dialog或者popwindow

7,不要在srcollView 中且套listView或者recleview 会一次性加载view

进程和线程

1,在进行大数据对象传递的时候不用intent,用evenbus

2,application 启动的时候非必须加载库lib异步调用

3,启动线程池,最好自己配置一个自己需要的,一方面又其对应的局限性,一方面对自己定义的有非常明显的要求。

线程池不许用Executors 去创建,而应该用threadpoolExecutor 去创建

a,fixedThreadPool 和 singleThreadPool允许请求的对打长度都是 int最大值,需求队列太长,容易oom

b,cachedThreadPool 和 scheduleThreadPool 创建线程数多,也容易引发oom异常。

4,不要在非子线程调用UI线程的东西,不适用viewstub 在子线程中

5,线程设置时候要设置自己的名字,定位上比较方便

6,ThreadPoolExecututor 调用setkeepalive设置线程空闲保活时间。

7,禁止在多个进程中调用sharepreference

文件和数据库

1,不用硬编码方式设置文件路径,改用系统提供的api

2,检查存储位置的可用性,

3,应用之间的文件共享不要放宽权限, 用fileprovider 去使用

4,sharepreference 只用于 int boolean string复杂文件用数据库

5,apply(写入内存最后在写入磁盘) 和commit(写入磁盘)

6,数据库 cursor 记得关闭,写入数据库用事务写入,用sqllitedatabase 的 insert update delete 不用 exesql 防止注入的风险

用contentprovider 管理存放到数据库的时候避免外部拼接进入,而应该用? 来显示具体字符串数量,有效避免的注入的风险。

bitmap 和drawable动画

猜你喜欢

转载自blog.csdn.net/sheng2459704496/article/details/81625379