Android 开发笔记

gneg

贡献于2015-07-22

字数:0 关键词: Android开发 移动开发

1. 本书简介 2. 常用字符串处理 i. 时间字符串格式化 ii. 获取url参数 3. 常用工具 i. apktool反编译apk包 ii. keytool查看签名 iii. dex2jar反编译java iv. 常用adb命令 v. 获取手机root权限 vi. 手机抓包工具 vii. 使用Gradle插件 4. view界面操作 i. 隐藏状态栏 ii. listview常用技巧 iii. 软键盘操作 iv. EditText文字监听 5. 常用自定义控件 i. 自定义checkbox 6. 多线程相关 i. executeService使用 Table of Contents 分享Android开发中遇到的各种坑以及各种折腾经验。 之所以写这本书,主要是因为日常开发中需要复用的问题着实不少,而且部分问题和解决的经验也容易忘 记,在这之前基本都是以博客方式来记录问题,但是对于程序员来说,使用 Markdown 是我最喜欢的表达 方式,因此才开始了这一系列的电子书。 本书的源文件已托管到 github 上:https://github.com/apptut/AndroidNote,并且在持续更新当中,写不完 的代码,填不完的坑.. 在线阅读地址:http://apptut.com/android-note/ 或者 http://apptut.gitbooks.io/android-note/ 欢迎交流:liangqi000@gmail.com Android开发笔记 开发中我们经常与字符串打交道,了解一些常用的字符串操作方式无疑对我们的开发大有益处。 本节会整理一些常用的字符串编辑技巧与代码片段,以提升之后的开发效率。 常用字符串处理 一般来说服务端会把格式化的字符串输出给客户端,一般不需要客户端自己来处理,但是总有特殊的时 候,所以整理了一些常用的时间格式化场景: 使用 SimpleDateFormat 格式化时间: // 解析 2015-01-18T09:47:26.000+0000 字符串 Date date = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ").parse(jsonObject.optString( // 重新输出新格式 String time = new SimpleDateFormat("yyyy-MM-dd HH:mm E").format(date); //解析后为: 2015-01-18 09:47 周日 时间字符串格式化 1. 场景一 String url = "http://apptut.com/?param=123"; Uri srcUri = Uri.parse(url); // 获取param的值 String value = srcUri.getQueryParameter("param"); 获取url参数 本节整理 Android 开发中的常用小工具使用,有了这些小工具,我们能快速定位开发中的各种问题。 常用工具 其实去反编译别家的apk不是很道德,但是有时候我们可能需要反编译自家的apk,查看里面的一些信 息, apktool 可以用来反编译apk查看其中的资源文件: 1. 官网下载安装,http://code.google.com/p/android-apktool/和 apktool mac 命令包 apktool-install- macosx-r05-ibot.tar.bz2 解压,拷贝 两包下所有文件到 /usr/local/bin/ 目录。 2. 反编译命令: apktool d [demo.apk] // 参数是 d 而不是 -d。 apktool反编译apk包 对于一个完整的Apk包,可能我们最常用的需要查看当前Apk的签名信息,或者 md5 密钥,最方便的是使 用 keytool 工具: keytool -list -keystore ~/tools/app.keystore // 然后根据提示输入keystore密钥即可 使用 keytool 查看签名 apktool 只能反编译apk包中的资源文件,其中的 java 文件不能被反解为汇编语言,所以如果要看包里的 java文件,需要用这个软件: 首先需要下载 dex2jar 脚本,百度即可 a) 更改需要反编译的 demo.apk 为 demo.zip,然后unzip demo.zip包 b) 然后执行 sh dex2jar.sh class.dex。 c) 使用 js-GUI 工具查看 class.dex解压过的jar包文件即可。 dex2jar反编译java 了解一些常用的adb命令,会给开发带来便利,我经常会使用下面的命令: 推送电脑文件到手机目录 格式:adb push <电脑目录> <手机目录> 例如:adb push ~/Desktop/000.jpg /sdcard/ 注意: 手机目录必须以 / 结尾,并且关闭手机和电脑的 USB存储设备 连接选项。如果拷贝电脑上整个目录下的文 件,到手机某个目录,那么电脑文件夹不需要加/。 例如:adb push ~/Desktop/test /sdcard/test 拷贝test目录下所有内容到 手机test目录 与其说是adb命令,还不说删除其实是shell命令,android手机其实就是linux码: 1. adb shell 使用shell命令 2. su 获取root权限 3. cd /sdcard/ 4. rm -r XXX.file 文件 安装apk adb install [文件名称.apk] 重新安装该软件 adb install -r apk文件名称.apk 卸载apk软件 adb uninstall apk包名.apk 安装卸载注意 可能直接使用adb install不会成功,或许需要你使用sudo方式: sudo adb install [文件.apk] 甚至需要root你的手机,如何root手机将会在下一节介绍。 常用adb命令 1. adb push 命令使用 2. adb 删除手机文件 3. 安装与卸载 Q:手机好好的,为撒要 root 呢? A:因为对于做开发的人来说,肯能需要查看手机安装包下的某些隐私文件,比如是数据库,app配置文 件,缓存文件等,方便自己开发。 第一步,随便找个root软件,360、百度等等都有类似的获取 root 权限的软件,选择一个安装到手机上, 然后安装应用的操作直接获取 root 权限: 如果提示获取成功,那么ok,第一步算是完成了,接下里看看能不能使用adb取得手机的root用户权限: adb shell su 输入然 su 命令后,回车,如果命令行前面的$变为#号,那么恭喜您,你已成功 root ,这时候你可以对你 的手机为所欲为,比如看看你安装包目录下数据库文件,把他导出到桌面啥的。 获取手机root权限 1. root手机方法 但是需要提醒的是,你现在拥有 root 用户的权限,但是在对其他目录操作前你可能需要更改该目录相应 的权限,再做文件的操作,比如: chmod 777 /data chmod 777 /data/data chmod 777 /data/data/com.apptut.android chmod 777 /data/data/com.apptut.android/caches chmod 777 /data/data/com.apptut.android/cached/database chmod 777 /data/data/com.apptut.android/caches/database/test.db adb pull /data/data/com.apptut.android/caches/database/test.db ~/Desktop/ 这里比较坑爹的是,获取手机某个目录下文件所有权限,只能一层一层的获取,如果你想使用 chmod -R 777 /data 这样的命令把 /data 目录下所有文件权限都改掉是行不通的,比较蛋疼-_-!!,你可以试试 同样,要是你想在你的 eclipse 的 DDMS 或者 android studio 中得 DDM 中可视化查看手机相应目录,你 还是先得更改此文件夹的权限(其实不是你root不成功,是root你没该目录权限),然后才能在界面上看到 该文件夹的子目录: 这里推荐两款比较经典的手机抓包工具(当然不光是手机开发使用,Web开发也适用): 1. Fiddler windows平台下强大的抓包工具(其实也有其他平台,但是很挫),Mac不好用 2. Charles Mac下可以使用这个,缺点是它是个收费的软件。 使用这个软件如何抓取手机上数据包,网上资料一堆,百度谷歌一下即可,推荐一个介绍比较详细的文 章:http://www.trinea.cn/android/android-network-sniffer/ 需要说明的是,使用这个工具抓取手机数据包,你需要做一些额外设置(默认是不支持手机抓包的),勾 选以下内容,然后重启 Fiddler 即可 Connections -> Allow remote computers to connect 具体使用说明,请参考参考上述链接地址,如果链接有损坏,请及时联系我。 官网网址:http://www.telerik.com/fiddler 和 Fiddler 用法类似,这个软件默认开启了远程网络请求功能,因此软件本身不需要做任何设置,直接设 置手机代理即可。 具体使用方法,可参考这篇文章:http://blog.devtang.com/blog/2013/12/11/network-tool-charles-intr/ 还是那句老话,如果链接能使用,你能看到具体这个软件使用方法,虽然作者文章中是针对 IOS 开发的, 但是也适用于 Android 开发,如果链接无法打开,请及时联系我。 官方网址:http://www.charlesproxy.com/ 手机抓包工具 1. 使用 Fiddler 抓取手机数据包 2. 使用 Charles 抓取手机数据包 从 Eclipse 转到 Android Studio 后,免不了与 Gradle 打交道,掌握一些常用的 Gradle 使用方法,是 自动化打包(apk包)变得很方便。 需要说明的是, Android Studio 集成的是 Gradle 专为 Android 开发的插件,使用这个插件,只需要我 们添加一些默认的配置,或者一些自动化任务,我们就能完成类似于自动生成多渠道包、签名、添加版本 号等。 Gradle 本身能干很多事情(不光是android自动化构建),但是作为 Android 开发人员来说,我们只需要 了解于如何在 Android 开发中做一些自动化部署的知识即可,如果你需要掌握更多关于 Gradle 的知识, 请移步于官网:https://gradle.org/ 现在我们关注 Gradle 经常用到的情景,当前使用 Gradle 插件版本为: gradle-version: 2.2.21 1.1 基本配置字段 android { compileSdkVersion 19 buildToolsVersion '19.1.0' defaultConfig { applicationId "com.example.app" minSdkVersion 8 targetSdkVersion 19 manifestPlaceholders = [channelValue: "6"] versionCode 1 versionName "1.0" } # ... } compileSdkVersion 表示当前参与编译的sdk版本,以及参与编译工具( buildToolsVersion )所对应的 版本。 defaultConfig 字段用来配置设置一些常用配置字段,如果设置此模块下相应字段,那么在打包的时候, 会自动替换调 AndroidManifest.xml 中的相应字段。(需要注意) 这个模块下有一个字段需要特别说明: manifestPlaceholders ,此字段用来动态替 换 AndroidManifest.xml 所设置的占位符内容,对于构建多渠道包非常有好处,例如,我们现在需要把不同 渠道id在打包时自动生成到 AndroidManifest.xml 中,那么可以这样:: 使用Gradle插件 1. Gradle常用的情景 然后再 build.gradle 中替换掉: manifestPlaceholders = [channelValue: "6"] #可以多个参数,参数名自定 至于当前模块下其他参数内容很明了,无需详说,需要再次强调的这些字段会最终替换 调 AndroidManifest.xml 的字段(切记,切记!!!) 1.2 签名字段 该模块下用来设置设置签名密钥相关字段,但是这里唯一觉得不足的是暴露了密钥文件以及密码,但是也 没办法,自动化就得知道这些。 release { storeFile file("keystore/android.keystore") #签名文件位置 storePassword "A7HbvETmGSj8WEKJZC" #存储密码 keyAlias "android.keystore" #别名 keyPassword "A7HbvETmGSj8WEKJZC" #签名密码 } 1.3 buildTypes buildTypes 用来指定最终编译字段配置。 release { minifyEnabled true #是否压缩 proguardFiles 'proguard.cfg' #是否混淆 signingConfig signingConfigs.release #签名 // 定制不同渠道修改此处即可 覆盖defaultConfig 渠道字段后的release包 // manifestPlaceholders = [channelValue: "6"] } 1.4 sourceSets资源配置 该字段下主要配置一些项目资源路径。 1.5 productFlavors渠道包字段 该字段用来打不同的渠道包,如果不同的渠道包下有不同的文件需要合并,那么只需要在 src/ 目录下建 立以渠道名作为根目录的根目录即可: #自定义两个渠道,渠道名为Channel123,Official渠道 "Channel123"{ manifestPlaceholders = [channelValue: "1"] } // 官方渠道 "Official" { manifestPlaceholders = [channelValue: "6"] } 如上述描述两个渠道,如果说两个渠道的某些项目文件不一样,那么可以以各自的渠道名作为根目录建立 各自不同的项目文件路径即可: src/ main/ #全局的代码 images/ #假设有一个图片文件下有俩文件 a.png b.png Channel123/ #此频道下自己不同的文件(任何文件),覆盖main下文件即可,相同的文件路径 images/ a.png #如果a.png不一样,那么直接覆盖即可 Offcial/ #类比Channel123 2. gradle示例模板: android { compileSdkVersion 19 buildToolsVersion '19.1.0' defaultConfig { applicationId "com.example.app" minSdkVersion 8 targetSdkVersion 19 manifestPlaceholders = [channelValue: "6"] versionCode 1 versionName "1.0" } # 设置包签名字段 signingConfigs { release { storeFile file("keystore/android.keystore") storePassword "A7HbvETmGSj8WEKJZC" keyAlias "android.keystore" keyPassword "A7HbvETmGSj8WEKJZC" } # 此处可以做其他自定义任务 } buildTypes { release { minifyEnabled true proguardFiles 'proguard.cfg' signingConfig signingConfigs.release // 定制不同渠道修改此处即可 覆盖defaultConfig 渠道字段后的release包 // manifestPlaceholders = [channelValue: "6"] } } sourceSets { main { jniLibs.srcDirs = ['libs'] //ndk编译目录,默认是main/jniLibs/ } } //渠道包打包例子 productFlavors { #自定义渠道,渠道名为Channel123 "Channel123"{ manifestPlaceholders = [channelValue: "1"] } // 官方渠道 "Official" { manifestPlaceholders = [channelValue: "6"] } } } # 第三方依赖 dependencies { compile 'com.android.support:support-v4:19.1.0' compile 'com.nineoldandroids:library:2.4.0' compile 'com.loopj.android:android-async-http:1.4.6' } 本节整理一些常用的界面操作技巧以及相关代码,例如:在不必重启activity的情况下隐藏状态栏等。 view界面操作 网上有很多关于如何隐藏状态栏的代码,但大部分都是需要重新启动当前的Activity,这样做有时候让人很郁 闷,然而使用下面的代码可以避免重启,经测试 Android 2.3+ 都能奏效: 隐藏状态栏: WindowManager.LayoutParams lp = getWindow().getAttributes(); lp.flags |= WindowManager.LayoutParams.FLAG_FULLSCREEN; getWindow().setAttributes(lp); getWindow().addFlags(WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS); setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE); 显示状态栏: WindowManager.LayoutParams attr = getWindow().getAttributes(); attr.flags &= (~WindowManager.LayoutParams.FLAG_FULLSCREEN); getWindow().setAttributes(attr); getWindow().clearFlags(WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS); 隐藏状态栏 Android 下的 listview 坑比较多,主要是版本兼容性下带来了一些列问题: 1. 不要使用 listSelector 当需要给 listview item设置背景效果时,建议不要直接使用 listSelector 来设置背景图,因为默 认 listview 自带默认背景点击效果,不同版本还不一样,而且使用 listSelector 设置的背景,在低版本 上点击item时,部分android2.3设备还有点击一个Item,所有item背景都会有选中效果变化的bug。 因此建议设置 listSelector 为null或者 transprent ,然后使用每个item自己的布局文件设置背景: 每个item布局文件: 2. 使用clipToPadding做半透效果 要描述它的使用场景直接看下面这张图即可: 产品需求是:有一个导航条覆盖在 listview 上,并且导航有半透明效果,希望能看到 listview 穿透效 果,就需要使用此属性,此属性默认是关闭的,因此需要设置为false,然后再设置'padding'属性即可: 软件盘常用操作方法。 EditText editText = findViewById(R.id.editView); InputMethodManager inputManager = (InputMethodManager) editText.getContext().getSystemService(Context.INPUT_METHOD_SERVICE); inputManager.hideSoftInputFromWindow(editText.getWindowToken(), 0); 软键盘操作 1.1 隐藏软件盘 1.1 显示软件盘 监测输入字符 EditText 文字输入监听使用 addTextChangedListener : EditText.addTextChangedListener(new TextWatcher() { @Override public void beforeTextChanged(CharSequence s, int start, int count, int after) { } @Override public void onTextChanged(CharSequence s, int start, int before, int count) { } @Override public void afterTextChanged(Editable s) { } }); EditText文字监听 常用自定义代码 view_custom 自定义checkbox使用的时 android:background 而不是 android:button ,原因在于使用 button 时自定 义图片过大超出边缘部分会截断,而使用 background 时会自由拉伸。 自定义checkbox 1.1 自定义checkbox 选中图片 1.1.1 自定义button图片 1.1.1 自定义checkbox样式 1.1.3 使用 多线程相关代码 多线程相关 // todo executeService使用

下载文档,方便阅读与编辑

文档的实际排版效果,会与网站的显示效果略有不同!!

需要 5 金币 [ 分享文档获得金币 ] 2 人已下载

下载文档

相关文档