
Android
文章平均质量分 55
小北的博客
八年 Android 开发经验,熟练掌握 Android 的 Framework, 精通 Android 上层 App 开发。
展开
-
Android代码混淆之混淆规则
ProGuardAndroid开发的应用程序是用Java语言开发的, 由于Java代码是非常容易反编码的,为了很好的保护Java源代码,我们需要对编译好后的class文件进行混淆。ProGuard是一个免费的Java类文件收缩,优化,混淆和预校验器。它可以检测并删除未使用的类,字段,方法和属性。它可以优化字节码,并删除未使用的指令。它可以将类、字段和方法使用短无意义的名称进行重命名。这些步骤让代码更原创 2017-07-21 16:40:17 · 2057 阅读 · 0 评论 -
Android Studio中如何制作和使用.9.png(Nine Patch)图片
原理在Android应用开发计程中,为了适配不同的手机分辨率,图片大多需要拉伸或者压缩,这样就出现了可以任意调整大小的一种图片格式“.9.png”。这种图片是用于Android开发的一种特殊的图片格式,它的好处在于可以用简单的方式把一张图片中哪些区域可以拉伸,哪些区域不可以拉伸设定好,同时可以把显示内容区域的位置标示清楚。.9.png图片相比普通图片,在四条边会多出1px的空隙,我们在这1px的空隙原创 2017-07-21 13:17:35 · 2490 阅读 · 0 评论 -
Android 7.0 适配-应用之间共享文件(FileProvider)
在Android7.0系统上强制启用了被称作 StrictMode的策略,带来的影响就是App对外无法暴露file://类型的URI了。如果在App中使用Intent携带这样的URI去打开外部App(比如:打开系统相机拍照),那么会抛出FileUriExposedException异常。官方给出如下的解决方案,就是使用FileProvider:我们来看一段代码:String cachePath =原创 2017-07-17 09:34:15 · 2157 阅读 · 0 评论 -
Android - monkey 参数说明
adb shell monkey -p com.*. -v -v –throttle 200 –pct-touch 50 –pct-motion 30 –pct-nav 0 –pct-majornav 0 –pct-appswitch 10 –pct-anyevent 0 –pct-trackball 10 –pct-syskeys 0 1000Android - monkey 参数说明 -p原创 2017-06-28 14:01:29 · 958 阅读 · 0 评论 -
Git合并特定commits 到另一个分支
有时候我们需要只合并需要的那些commits,不需要的commits就不合并进去了。合并某个分支上的单个commit首先,用Git log查看一下你想选择哪些commits进行合并,例如:commit f3e50d18922390742ea653f163d20fa90e38c0c6Author: chenzongwen <chenzongwen@soyoung.com>Date: Wed J原创 2017-07-05 20:44:22 · 1404 阅读 · 0 评论 -
Android drawText获取text宽度的三种方式
@Override public void draw(@NonNull Canvas canvas) { canvas.drawColor(Color.parseColor("#F3F5F9")); paint.setColor(Color.parseColor("#AEAEAE")); paint.setAntiAlias(true);原创 2017-07-05 14:31:31 · 1277 阅读 · 0 评论 -
Android设置重复文字水印背景
效果如图:自定义Drawable :/** * Created by Owen Chan * On 2017-07-05. */public class WaterMarkBg extends Drawable { private Paint paint = new Paint(); private String logo = "SoYoung"; public WaterM原创 2017-07-05 14:09:10 · 3743 阅读 · 2 评论 -
Android 如何自定义CrashHandler与崩溃后自动重启
如何捕获捕获Crash分如下三步:1、实现Thread.UncaughtExceptionHandler接口,并重写uncaughtException方法,在uncaughtException 方法中接收异常信息 2、调用Thread.setDefaultUncaughtExceptionHandler(CrashHandler) ,来使用我们自定义的CrashHandler来取代系统默认的Cra原创 2017-06-10 21:58:54 · 5027 阅读 · 0 评论 -
Butterknife.OnClick中防止按键过快的点击的的一种解决方案。
按键的防抖就是判断一下两次点击的时间差,但是如果在Butterknife.OnClick中写,每次都要写一堆代码 其实我们希望的最理想的解决方案是:@OnClick({R.id.record, R.id.combine})public void onClick(View view) { if (AntiShake.check(view.getId())) { //判断是否多次点击原创 2017-06-08 21:08:05 · 7600 阅读 · 1 评论 -
Android apk 瘦身 去掉不需要的so
android支持的cpu架构(目前是七种) armeabi 第5代 ARM v5TE,使用软件浮点运算,兼容所有ARM设备,通用性强,速度慢 armeabi-v7a 第7代 ARM v7,使用硬件浮点运算,具有高级扩展功能 arm64-v8a 第8代,64位,包含AArch32、AArch64两个执行状态对应32、64bit x86 intel 32位,一般用于平板原创 2017-06-18 12:57:27 · 2205 阅读 · 0 评论 -
Android使用getIdentifier()方法根据资源名来获取资源id
在Android开发的过程中我们需要动态的根据一个资源名获得到对应的资源id,我们可以使用getResources().getIdentifier()方法来获取该id, 然后通过该id进行相应的操作。使用方法如下:1、工程目录如下:2、MainActivity代码如下:public class MainActivity extends AppCompatActivity { @Override原创 2017-06-17 14:41:09 · 6318 阅读 · 0 评论 -
getDrawable(int id) getColor(int id) is deprecate 已过时
写代码是发现:推荐使用:为了兼容高、低版本 可以采用ContextCompat.getColor(Context context, int id);以下为getColor(int id)源码(Resource.java):/** * Returns a color integer associated with a particular resource ID. If the * resourc原创 2017-05-21 09:38:21 · 2239 阅读 · 0 评论 -
android.content.res.Resources$NotFoundException: String resource ID #0x1 错误
在开发的过程中我们会遇到如下的错误:原因是public final void setText(@StringRes int resid) { setText(getContext().getResources().getText(resid)); }TextView 有个setText(int reid) 方法,如果我们从网络上获取到的数据是int 不是String 然后原创 2017-05-31 21:23:32 · 18516 阅读 · 2 评论 -
Android TextView setcompounddrawables 图片不显示的问题
在代码中可以设置Drawable显示在text的左、上、右、下位置,有如下两个方法:setCompoundDrawables(left, top, right, bottom)setCompoundDrawablesWithIntrinsicBounds(left, top, right, bottom)1、setCompoundDrawables(left, top, right, bottom原创 2017-05-31 21:12:52 · 1576 阅读 · 0 评论 -
Java 用正则表达式判断输入的字符串是否为手机号码
使用到正则表达式判断用户输入的手机号码是否正确,以后出现了新的格式修改一下正则表达式的规则就行。介绍下正则表达式: ^匹配输入字符串开始的位置, $匹配输入字符串结尾的位置, [xyz] 字符集。匹配包含的任一字符 [^xyz]反向字符集。匹配未包含的任何字符, \d数字字符匹配public class CheckPhoneFormatUtils { /** 正则表达 *原创 2017-05-03 19:18:48 · 11651 阅读 · 0 评论 -
Android源码分析-SparseArray<E>详解
SparseArray 实现原理在使用HashMap的时候IDE会给出如下提示:SparseArray 类注释如下: SparseArrays map integers to Objects. Unlike a normal array of Objects, there can be gaps in the indices. It is intended to be more memory原创 2017-07-24 16:31:36 · 640 阅读 · 0 评论 -
Android API 等级与Android版本对应关系
Android API 等级与Android版本对应关系API等级1:Android 1.0 (没有开发代号) 2008年9月23日API等级2:Android 1.1 Petit Four 2009年2月2日API等级3:Android 1.5 Cupcake 2009年4月17日API等级4:Android 1.6 Donut原创 2016-03-22 16:50:27 · 1555 阅读 · 1 评论 -
Android 源码解析 - ScrollView
ScrollView 可以在垂直方向做滑动显示内容,并且ScrollView中只能添加一个子View,下面对源代码进行分析。源码解析ScrollView 继承关系onMeasure方法@Overrideprotected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { super.on原创 2018-01-15 20:13:33 · 628 阅读 · 2 评论 -
gradientRadius 的适配问题
gradientRadius percentages 支持Android 5.0之后的系统,如果是之前的需要使用自定义View。自定义View 如下:public class RadialGradientView extends View { private final int endColor; private final int startColor; priv原创 2018-01-04 20:31:31 · 1407 阅读 · 0 评论 -
Android 源码解析 - Scroller
分析版本 : Android API 26介绍Android开发中,如果我们希望使一个View滑动的话,除了使用属性动画外。 我们还可以使用系统提供给我们的两个类Scroller和OverScroller用来实现弹性滑动。下面分析一下Scroller的使用方法以及实现方式。View中的scrollBy()和scrollTo()方法介绍/** * Set the sc原创 2018-01-12 21:47:30 · 391 阅读 · 0 评论 -
避免使用startActivityForResult
startActivityForResult 所有处理结果的逻辑都要放到onActivityResult中,在onActivityResult里面根据requestCode作不同处理,这样逻辑比较复杂, 我们希望的是能在发起startActivityForResult的时候捎带着把获取结果后处理的逻辑也传进去,并能在内部做处理。下面我们参考RxPermissions的做法给出了一种解决方法 Git原创 2018-01-04 10:42:19 · 1124 阅读 · 0 评论 -
Android 动画 一篇就够
动画实际上就是在指定的时间段内持续修改某个属性的值, 使得该值在指定取值范围内平滑过渡。 动画可以分为三大类, 帧动画(Frame Animation)、补间动画(Tweened Animation)、属性动画(Android 3.0 之后增加的属性动画)帧动画帧动画是最容易实现的一种动画,这种动画更多的依赖于完善的UI资源, 原理是一定的时间段内切换多张有细微差异的图片从而在视觉上原创 2018-01-11 11:38:32 · 341 阅读 · 0 评论 -
Android 源码解析- Handler 实现机制
源码是Android API 25Handler 、 Looper 、Message 这三者到底有什么样的关系?什么叫异步消息处理线程呢?本文将在源码层面进行分析。Android UI是线程不安全的,如果在子线程中尝试进行UI操作,程序就有可能出现ANR。解决的方法是创建一个Message对象,然后通过Handler发送出去,之后在Handler的handleMessage()方法中获得刚才发送的M原创 2017-09-11 09:37:05 · 673 阅读 · 0 评论 -
Android 数据库升级数据迁移以及数据库导入
在我们开发的应用中,一般都会涉及到数据库,使用数据的时候会涉及到数据库的升级、数据的迁移、增加行的字段等。比如,用户定制数据的保存,文件的端点续传信息的保存等都会涉及到数据库。我们应用第一个版本是V1.0,在迭代版本V1.1 时,我们在数据库中增加了一个字段。因此V1.0的数据库在V1.1版本需要升级,V1.0版本升级到V1.1时原来数据库中的数据不能丢失,那么在V1.1中就要有地方能够检测出来版本原创 2017-09-26 17:47:05 · 1943 阅读 · 0 评论 -
Android 硬件加速
原文地址:http://developer.android.com/guide/topics/graphics/hardware-accel.htmlAndroid 3.0(API level 11)开始支持硬件加速2D渲染, 意思就是所有的View 的canvas都会使用GPU,然而硬件加速会占用更多的RAM。在API >= 14上,硬件加速是默认开启的。 如果你的应用只是标准的View和Dra原创 2017-07-19 21:26:15 · 506 阅读 · 0 评论 -
Android跨进程通信的四种方式
Android系统中应用程序之间不能共享内存,在android SDK中提供了4种用于跨进程通讯的方式。这4种方式正好对应于android系统中4种应用程序组件:Activity、Content Provider、Broadcast和Service。1、其中Activity可以跨进程调用其他应用程序的Activity 2、Content Provider可以跨进程访问其他应用程序中的数据(以Cur原创 2017-09-05 16:36:32 · 5752 阅读 · 0 评论 -
Android 源码解析-AsyncTask
我们都知道Android 的子线程中是不能更新UI 的(当然也不是绝对的,在初始化的某个时机是可以的,稍后会根据源码进行分析为什么可以,期待吧),如果想要在子线程里进行UI操作,就需要借助Android的异步消息处理机制。为了更方便的在子线程中更新UI元素,Android从1.5版本后引入了AsyncTask类,AsyncTask从本质上讲,是对ThreadPool和handler的封装,本文首先介原创 2017-09-07 18:07:04 · 611 阅读 · 0 评论 -
Android Service的生命周期
Managing the Lifecycle of ServiceWhat is Service ?Service 是一个可以在后台执行长时间运行操作而不提供用户界面的应用组件。服务可由其他应用组件启动,而且即使用户切换到其他应用,服务仍将在后台继续运行。 此外,组件可以绑定到服务,以与之进行交互,甚至是执行进程间通信 (IPC)。 例如,服务可以处理网络事务、播放音乐,执行文件 I/O 或与内容提原创 2017-08-30 15:35:00 · 770 阅读 · 0 评论 -
Android 创建及调用自己的 ContentProvider
如何创建及调用自己的ContentProvider。Android 开发工程师对于ContentProvider的操作方法有一定程度的了解。在有些场合,除了操作ContentProvider之外,我们还有可能需要创建自己的ContentProvider,来提供信息共享的服务,这就要求我们很好的掌握ContentProvider的创建及使用技巧。下面我们就由表及里的逐步讲解每个步骤。 我们先来了解以原创 2017-02-16 19:29:51 · 2476 阅读 · 0 评论 -
Android AIDL 使用详解
AIDL AIDL (Android Interface Definition Language),Android接口定义语言,Android提供的IPC (Inter Process Communication,进程间通信)的一种独特实现。为什么使用AIDL 使用AIDL只有在你允许来自不同应用的客户端跨进程通信访问你的service,并且想要在你的service种处理多线程的时候才是必要的。原创 2017-09-06 15:36:35 · 3399 阅读 · 0 评论 -
深入理解 Android 系统升级
前言2013年7月至2015年6月在长虹担任Android系统研发工程师,主要负责长虹智能电视升级(OTA升级),研发平台是MST 628 和 MTK 5327等。摘要随着Android系统的快速发展,越来越多的智能终端设备搭载Android平台。Android系统升级的可以优化智能电视系统性能、更新系统内容。因此,Android系统升级在Android系统开发领域极其重要。如何保证Android系原创 2017-08-28 18:39:10 · 12901 阅读 · 1 评论 -
Android 中的消息传递-广播机制
Android中的广播机制非常灵活,Android中的每个应用程序都可以对自己感兴趣的广播进行注册,这个程序也只会收到自己所关心的广播内容,这些广播可能是来自于系统的,也可能是来自于其他应用程序的。原创 2017-09-04 09:13:49 · 1422 阅读 · 0 评论 -
Android 自动填充短信验证码
目前在很多应用中,都有自动获取验证码的功能:点击获取验证码按钮,收到短信,当前应用不需要退出程序就可以获取到短信中的验证码,并可以做到自动填充,无须用户在短信和App之间来回切换。重新定义ContentObserver用来监听短信,一旦有新消息过来,就去判断是否有我想要的那个号码发过来的短信,如果是,就直接用正则表达式截取验证码,代码如下:public class SMSContentObserve原创 2017-05-03 18:25:16 · 1398 阅读 · 0 评论 -
Android 登录输入框自动上移
仿照拉钩网的登录做的登录界面,如图github 地址:https://github.com/chenzongwen/login原创 2017-05-02 19:43:41 · 1712 阅读 · 0 评论 -
RelativeLayout中的参数说明
RelativeLayout中的参数: android:layout_above 将该控件的底部至于给定ID的控件之上,但不会左对齐,默认置于父窗口最左边,会覆盖最左边的控件 android:layout_below 将该控件的顶部至于给定ID的控件之下,但不会左对齐,默认置于父窗口最左边,会覆盖最左边的控件 android:layout_toLeftOf 将该控件的右边缘和给定ID的控件的原创 2016-12-27 09:10:03 · 1288 阅读 · 0 评论 -
startActivityForResult 后直接执行onActivityResult原因
startActivityForResult,出错,跟踪后发现activity并没有被启动,而是直接执行 onActivityResult。通过查看日志发现WARN/ActivityManager(67): Activity is launching as a new task, so cancelling activity result.”原来是把要启动的activity的launchmode设置原创 2016-12-18 13:39:20 · 1191 阅读 · 0 评论 -
Android webview图片点击事件 查看图片
思路:1.webview与js交互; 2.webview添加ontouchListener; 3.通过onTouch实现点击事件,获得点击的x、y坐标; 4.通过x、y坐标的位置,使用js方法获得图片地址 ,完成点击事件;优点:点击事件是通过webview实现,而html只需要获取图片的地址。代码public class MainActivity extends Activity原创 2016-11-23 09:09:18 · 1892 阅读 · 0 评论 -
Android configChanges属性总结
在Android系统默认的情况下,当“屏幕方向”或“键盘显示隐藏”变化时都会销毁当前Activity,创建新的Activity。如果不希望重新创建Activity实例,可以在AndroidManifest.xml中配置android:configChanges="keyboardHidden|orientation" >这样就不会销毁重建了,在配置了这个属性后,android:configChang原创 2016-11-02 09:05:16 · 15642 阅读 · 0 评论 -
MVP架构模式
什么是MVP架构MVP(Model-View-Presenter)是从经典的模式MVC演变而来的,它们的基本思想有相通的地方:Controller/Presenter负责逻辑的处理,Model提供数据,View负责显示。作为一种新的模式,MVP与MVC有着一个重大的区别:在MVP中View并不直接使用Model,它们之间的通信是通过Presenter (MVC中的Controller)来进行的,所有原创 2016-10-27 09:19:06 · 805 阅读 · 0 评论 -
基于Android Studio的内存泄漏检测与解决
什么是内存泄漏Android虚拟机的垃圾回收采用的是根搜索算法。GC会从根节点(GC Roots)开始对heap进行遍历。到最后,部分没有直接或者间接引用到GC Roots的就是需要回收的垃圾,会被GC回收掉。而内存泄漏出现的原因就是存在了无效的引用,导致本来需要被GC的对象没有被回收掉。 比如:public class LeakActivity extends AppCompatActivit原创 2016-09-29 13:44:04 · 1868 阅读 · 0 评论