转载自:http://mp.weixin.qq.com/s?__biz=MzA4MjU5NTY0NA==&mid=404388098&idx=1&sn=8bbbba7692dca68cdda2212dec4d86c0&scene=21#wechat_redirect

今天是冯建同学投稿,总结他在Android开发方面的各种小经验,我觉得非常有意义,所谓经验丰富有时候是指积累的这些小经验非常多,他这篇分享相信会帮助到一些朋友。我也曾推荐过他的 APK魔鬼瘦身

一文,没看过的朋友也可以再去看看。

做Android久了,就会踩很多坑,被坑得多了就有经验了,闲暇之余整理了部分,现挑选一些重要或者偏门的“小”经验做个记录。

查看SQLite日志

因为实现里用了Log.isLoggable(TAG, Log.VERBOSE)做了判断,在LessCode的LogLess中也参考了这种机制:https://github.com/openproject/LessCode/blob/master/lesscode-core/src/main/java/com/jayfeng/lesscode/core/LogLess.java

使用这种方法就可以在Release版本也能做到查看应用的打印日志了。

PNG优化

APK打包会自动对PNG进行无损压缩,如果自行无损压缩是无效的。

当然进行有损压缩是可以的:https://tinypng.com/

Tcpdump抓包

有些模拟器比如genymotion自带了tcpdump,如果没有的话,需要下载tcpdump:

http://www.strazzere.com/android/tcpdump

把tcpdump push到/data/local下,抓包命令:

查看签名

很多开发者服务都需要绑定签名信息,用下面的命令可以查看签名:

注意,这个是需要密码的,可以查看MD5, SHA1,SHA256等等。

单例模式(懒汉式)的最佳写法

特别说到这个问题,是因为网上很多这样的代码:

这种写法线程不安全,改进一下,加一个同步锁:

网上这样的代码更多,可以很好的工作,但是缺点是效率低。

实际上,早在JDK1.5就引入volatile关键字,所以又有了一种更好的双重校验锁写法:

这才是最佳写法!!!

不是说第二种写法有问题,或者在Android中一定要用第三种写法,只是告诉大家一种更好的写法。

多进程Application

是不是经常发现Application里的方法执行了多次?百思不得其解。

因为当有多个进程的时候,Application会执行多次,可以通过pid来判断那些方法只执行一次,避免浪费资源。

隐式启动Service

这是Android5.0的一个改动,不支持隐式的Service调用。下面的代码在Android 5.0+上会报错:Service Intent must be explicit:

可改成如下:

fill_parent的寿命

在Android2.2之后,支持使用match_parent。你的布局文件里是不是既有fill_parent和match_parent显得很乱?

如果你现在的minSdkVersion是8+的话,就可以忽略fill_parent,统一使用match_parent了,否则请使用fill_parent。

ListView的局部刷新

有的列表可能notifyDataSetChanged()代价有点高,最好能局部刷新。

局部刷新的重点是,找到要更新的那项的View,然后再根据业务逻辑更新数据即可。

强调一下,最后那个列表数据别忘记更新, 不然数据源不变,一滚动可能又还原了。

系统日志中几个重要的TAG

一行居中,多行居左的TextView

这个一般用于提示信息对话框,如果文字是一行就居中,多行就居左。

在TextView外套一层wrap_content的ViewGroup即可简单实现:

setCompoundDrawablesWithIntrinsicBounds()

网上一大堆setCompoundDrawables()方法无效不显示的问题,然后解决方法是setBounds,需要计算大小…

不用这么麻烦,用setCompoundDrawablesWithIntrinsicBounds()这个方法最简单!

计算程序运行时间

为了计算一段代码运行时间,一般的做法是,在代码的前面加个startTime,在代码的后面把当前时间减去startTime,这个时间差就是运行时间。

这里提供一种写起来更方便的方法,完全无时间逻辑,只是加一个打印log就够了。

没有计算时间的逻辑,这能测出来?

把日志过滤出来,运行命令“adb logcat -v time | grep TAG”:

通过-v time参数,可以比较日志左边的时间来算出中间的代码运行的时间。

Java引用类型一览表

Context使用场景

为了防止Activity,Service等这样的Context泄漏于一些生命周期更长的对象,可以使用生命周期更长的ApplicationContext,但是不是所有的Context的都能替换为ApplicationContext

这是网上流传的一份表格:

图片缓存大小

现在很多图片库需要给图片设置一个最大缓存,但是这个值设置多少合适呢?

高端机和低端机的配置显然应该不同,可以考虑设置一个动态值。

建议设置为应用可用内存的1/8:

系统内置的一些工具类

在AOSP源码全局搜了一下包含Util关键字的类,整理出这个列表供大家参考:

这么多工具类,一定可以找到对你有用的。

ClipPadding

这个不多说,ListView的ClipPadding设为false,就能为ListView设置各种padding而不会出现丑陋的滑动“禁区”了。

强大的dumpsys

dumpsys可以查看系统服务和状态,非常强大,可通过如下查看所有支持的子命令:

这里列举几个稍微常用的:

bugreport命令

很多人都用过adb logcat,但是如果想要更详细的信息,logcat则无能为力。

所以大多数手机厂商测试更多的是用adb bugreport来抓log给开发人员分析。

dpi文件夹的换算比例

更新媒体库文件

以前做ROM的时候经常碰到一些第三方软件(某音乐APP)下载了新文件或删除文件之后,但是媒体库并没有更新,因为这个是需要第三方软件主动触发。

媒体库会在手机启动,SD卡插拔的情况下进行全盘扫描,不是实时的而且代价比较大,所以单个文件的刷新很有必要。

Monkey参数

大家都知道,跑monkey的参数设置有一些要注意的地方,比如太快了不行不切实际,太慢了也不行等等,这里给出一个参考:

一边跑monkey,一遍抓log吧。

小结

无论是大经验还是小经验,都是好经验,关键时候出奇效。

原文:http://blog.csdn.net/zhouli_csdn/article/details/50978336

android 启动service报错,Android小经验相关推荐

  1. android 反编译报错,android反编译

    常用反编译方法: 1.先将.apk改为.zip或者.rar用winrar加压得到classes.dex文件 2.用dex2jar工具将.dex转为.jar,然后用jd-gui就可以打开.jar查看源文 ...

  2. android 没有权限报错,android PowerManager 等权限问题

    今天想写一个 重启的压力测试,运行是出现下面问题: 一.运行报错java.lang.RuntimeException: Unable to start receiver runin.xtk.com.m ...

  3. android编译apk报错,android studio 编译出的apk安装报错 “应用是非正式发布版本,...

    Android开发--自定义控件 Android开发--自定义控件 一.创建一个XML布局文件用于存放自定义控件的布局 layout_item.xml ?xml version=1.0 encodin ...

  4. android studio override报错,android studio中的@Override

    原文链接 @Override是伪代码,表示重写(当然不写也可以),不过写上有如下好处: 1.可以当注释用,方便阅读 2.编译器可以给你验证@Override下面的方法名是否是你父类中所有的,如果没有则 ...

  5. android values-v21 style 报错,Android 4.4 以上实现透明导航栏和状态栏 Translucent system bar...

    第一种方式 第一种方式,需要做下面三步设置 1.在values.values-v19.values-v21的style.xml都设置一个 Translucent System Bar 风格的Theme ...

  6. android获取版本号报错,Android开发:获取安卓App版本号的方法步骤

    在Android开发过程中,想要开发一个完整功能的App,各个地方的内容都要涉及到,比如获取App的系统版本号就是必须要有的功能.Android的App版本号相关内容比iOS的App版本号内容要多,而 ...

  7. android 库编译报错,Android Studio编译项目报错

    编译项目时报以下错误: Error:Execution failed for task ':app:dexDebug'. > mon.internal.LoggedErrorException: ...

  8. Android Studio在模拟器启动项目报错

    android studio在模拟器启动项目报错 List of apks: [0] 'D:\Android Project\kotlin-compose-mobile-application\app ...

  9. android override报错,android @override 报错解决方案

    android @override 报错解决方案 现象: ... java: 1801: method does not override a method from its superclass @ ...

最新文章

  1. [转]css选择器优先级深入理解
  2. Spring Boot 2.x基础教程:使用MyBatis的XML配置方式
  3. 【Qt】数据库实战之QSqlTableModel模型
  4. Dubbo + Zookeeper入门初探
  5. linux 安装 php 5.2_Linux下安装PHP5.5
  6. linux下golang编译环境搭建
  7. python 随机数抽奖系统_python实现的简单抽奖系统实例
  8. 如何在JPG或BMP图片上显示输入的订单数据内容,并在报表打印时显示出来,后台数据库是SQL SERVER 2000 ,先谢了.高分!...
  9. 系统之家装机大师如何制作U盘启动盘?
  10. 浊度仪行业调研报告 - 市场现状分析与发展前景预测
  11. 你的系统可靠性和可用性是几个9?
  12. 如何删除QQ中的锁定QQ热键Ctrl+Alt+L?
  13. ObjectBox的探究
  14. 蓝牙耳机买什么品牌好一些?2022蓝牙耳机品牌排行榜10强
  15. 将HTML5封装成android应用APK文件的几种方法
  16. 【整理收集】使用当中IE浏览器遇到的兼容性问题
  17. 镭速(Raysync)文件传输高可用安装部署介绍!
  18. 前端 - excel导入 / 导出功能
  19. Jfrog Artifactory安装及备份恢复搭建
  20. 孙陶然:不要轻易开始创业

热门文章

  1. 高等数理统计(part3)--常见的连续型分布
  2. 第三次学JAVA再学不好就吃翔(part55)--StringBuffer类的删除功能
  3. mysql8.0日期类型_Mysql学习-数据类型(日期时间类型)
  4. 万能门店小程序_超市门店微信小程序注册流程
  5. 什么是 SAP C/4HANA Foundation
  6. SAP Spartacus ProductConnector和ProductService实现
  7. SAP CDS view 单元测试框架 Test Double 介绍
  8. SAP CRM webclient ui开发workbench里点了Test按钮,发生了什么事
  9. error when defining a rule - SAP loyalty management的积分定义规则
  10. Tomcat启动时加载本地证书出错的问题