安卓高级工程师,目前任职于Wifi万能钥匙
能力说明:
精通JVM运行机制,包括类生命、内存模型、垃圾回收及JVM常见参数;能够熟练使用Runnable接口创建线程和使用ExecutorService并发执行任务、识别潜在的死锁线程问题;能够使用Synchronized关键字和atomic包控制线程的执行顺序,使用并行Fork/Join框架;能过开发使用原始版本函数式接口的代码。
暂时未有相关云产品技术能力~
阿里云技能认证
详细说明01.scanf 1)scanf将回车空格都当作字符串结束的标志 2)以回车键作为输入完成的标识,但是回车键本身不会作为字符串的一部分 3)存在安全问题,加入用户在键盘输入的内容超过scanf参数中的数组长度,就会内存溢出,发生奔溃,这也就是微软在使用...
根据消息机制,手写了一个简单的handler模型,便于理解消息机制的原理,源码在GitHub:https://github.com/renzhenming/MyHandler.
源码地址:https://github.com/renzhenming/MyButterknife 相信大多数安卓人员开发中都在使用ButterKnife进行代码生成。
最近针对我们项目中app经常收不到推送的问题作了一些处理,增加app的保活管理。我们知道当安卓进程退到后台之后,很容易被系统杀死,这个时候推送消息一般都是收不到的。
1.单一职责原则(Single Responsibility Principle) 就一个类而言,应该仅有一个引起它变化的原因。简单来说,一个类中应该是一组相关性很高的函数、数据的封装。
c代码编译成可执行程序4步: 1.预处理:宏定义展开,头文件展开,条件编译,同时将代码中的注释删除,这里并不会检查语法 gcc -E hello.c -o hello.
在上一篇博客中已经分析了一部分如何绕过AndroidManifest检查启动一个未注册的Activity,这次就来实现这个功能 分析一下总的实现流程: 启动中有三个hook点,第一个就是Instrumentation中 int result = ActivityManagerNative.
app中每一个activity都要在AndroidManifest文件中配置,否则启动会抛出异常 Unable to find explicit activity class .
(创建于2016/12/20) 1,自定义一个TextView public class CustomTextView extends TextView { public CustomTextView(Context context) { ...
(创建于2016/11/17) import java.lang.reflect.Field; import android.content.
建造者模式.png 模式讲解: 设计者(Designer)和客户(Client)沟通明确需求 沟通后设计者将客户创建产品的需求划分为各个部件的建造请求(Builder) 将各个部件的建造请求委派到具体的建造者(WorkBuilder) ...
编写native方法,如: package com.example.renzhenming.appmarket.ui.selectimage; import android.
1.在GitHub上创建了一个新项目,如何将本地的一个工程上传上去 1) copy github项目地址 2) 在android studio中打开terminal命令行,执行命令将本项目所有代码添加 git add * 3)执行命令提交 git co...
(创建于2016/11/15) 方式一:易会项目中的方式 @Override protected void onCreate(Bundle savedInstanceState) { super.
(创建于2016/11/8) 1.在assets中创建资源文件content.css,文件内容如下(这只是个示例,是修改标签的,项目中是用于加载富文本,html加载没有实验过) body,p,div,h1,h2,h3,h4,h5,h6,span{ co...
(创建于2016/11/7) 只需要在该页面所在的activity的manifest中添加 android:windowSoftInputMode="adjustPan|stateHidden" stateHidden是为了隐藏键盘,adjustPa...
(创建于2017/1/19) 硬件加速 Android 3.0 (API level 11), 开始支持 所有的View 的canvas都会使用GPU,但是硬件的加速会占有一定的RAM。
(创建于2017/5/20) 一个网页中有如下代码 /* This function is invoked by the activity */ function wave() { alert("Android...
(创建于2018/2/9) 最近在一个混合开发的项目中遇到的一种数据解析方式,使用Cordova进行原生和js的通信,原生接收js消息的方式 final BroadcastReceiver popReceiver = new BroadcastRece...
(创建于2017/5/16) 首先要搞懂两个概念,gradle版本和gradle插件版本,比如我现在as升级到了2.3,那么2.3就是gradle版本,2.14.1就是gradle插件版本,这两个概念的一一对应的,而之所以出现这个报错信息,就是因为当前项目的gradle插件版本是2.14.1,而gradle2.3对应的插件版本就是3.3,所以导致了报错。
(创建于2017/10/20) 以module的方式依赖 项目中依赖了一个module,这个module中同时也依赖了其他东西,并且和我的依赖产生了冲突,所以我们需要让自己的项目在依赖这个module的同时不去依赖那些和我原有依赖冲突的内容,可以在build.
(创建于2017/3/8) 1、代码混淆 2、删除无用的语言文件,在module中的build.gradle文件中 defaultConfig { 。
原型模式属于创建型模式,用原型的实例指定创建对象的种类,并通过拷贝这些原型创建新的对象。调用者不需要关注具体的复制过程,而且不需要知道任何创建的细节,通俗来讲,就是使用一个对象复制一个一模一样的对象出来,目的就是保护最原始的那一份存档。
activity的启动流程之前已经通过源码了解了,那么app的启动流程是怎样的,从我们按下app的图标,到应用启动起来显示出画面,中间都经历了什么? 安卓是基于java的,所以和java有一定的相似性,一个java程序的起点是main,那么androi...
调用bindService方法绑定服务最终会执行Service的onBind方法并在ServiceConnection的onServiceConnected中得到IBinder对象,我们从源码角度看看这一过程是如何进行的 首先从ContextImpl的...
可能你曾经发现过,当你的activity继承的是AppCompatActivity时,如果在布局中设置一个TextView,这时候我们去打印这个TextView,打出来的是AppCompatTextView,那么为什么会这样?找到AppCompatAc...
我们知道,每一个View的子类都可以设置backgroud,那么这个背景是如何加载出来的呢? 找到View的构造方法 public View(Context context, @Nullable AttributeSet attrs, int defStyleAttr, int defStyleRes) { .
单例模式的几种形式 1.饿汉式:优点是线程安全,在加载类的时候就创建一次并且只会创建一次,缺点是还没有使用就加载好了,是典型的空间换时间,当类装载的时候就会创建类实例,即使你很长时间用不到它,不符合java的设计原则 public class Hung...
安卓源码中比较典型的工厂方法模式,Iterator,Iterator是一个接口,它定义了 迭代器的必须的一些规则,也就是说可以使用迭代器遍历元素的集合都是实现了这个接口,比如ArrayList,HashSet都是Collection的实现类,而Coll...
安卓源码中比较典型的简单工厂模式实现的类,BitmapFactory,通过传入不同的条件,得到同样的bitmap,也是一个生产Bitmap的工厂,这里给我们定义了很多生产的条件,但是假如有另一个生产bitmap的方式出现,就不得不修改BitmapFac...
首先我们要知道Activity是如何启动的,在文章https://www.jianshu.com/p/bd5208574430中我们已经看了Activity启动的源码,https://www.
使用阿里热修复需要添加依赖 compile 'com.alipay.euler:andfix:0.5.0@aar' 热修复的关键代码 //初始化阿里热修复 mPatchManger = new PatchManager(this); //获取当前应用版本 mPatchManger.
使用生产者消费者模式重构项目,实现音视频同步播放 音视频同步涉及到的知识 1.IPB帧 a) I帧:关键帧,I 帧图像采用帧内编码方式,帧内压缩,包含完整的画面 b) P帧:差别帧,与上一个关键帧的差别,需要缓存上一帧才能得到完整的画面 c) B帧:双...
(创建于2017/8/17) 指针的含义 #include int main() { int a = 10; int *p = &a; //这行代码等同于 int *p; p = &a; //int *p; /...
(创建于2017/8/16) 1.前置递归和后置递归 前置是倒叙,后置是正序 2.递归十进制转二进制 #include #include int to2(int n) { int i = n % 2; if (n>0) ...
在Activity的启动流程中,我们知道最终Activity是通过ClassLoader加载的 public Activity newActivity(ClassLoader cl, String className, Inte...
1.水仙花数 #include int main() { int i; for ( i = 100; i < 1000; i++) { int i1 = i % 10; int i2 = i / ...
(创建于2017/8/15) 1.在C语言中int main(),参数是空的,表示可以有参数可以没有参数 2.int main(void)表示明确的表达不能有参数 3.
(创建于2017/8/14) 1.float型变量a只能接受7位有效数字,因此最后三位是不准确的,但double型数字是可以全部接受10位有效数字的 2.常用转义字符: \0 空字符 0 \t 水平制表,跳到下一个Tab位置 9 \r 回车,将当前位置移到本行的开头 13 \n 换行,将当前位置移到下一行的开头 10 ' 双撇号 34),"" 单撇号 39 3.逗号运算符(逗号运算的结合性是从左至右,完毕之后整个表达式的值是最后一个表达式的值。
(创建于2017/8/13) system命令(命令行) 1.calc 打开计算器 2.control 打开控制面板 3.system("start calc");//执行打开计算器的动作(这些命令都可以这样调用) 4.
AsyncTask作为android原生的处理异步任务的方案,问题很多,比如不允许多个任务同时运行,关于这一点,网上有很多说法,早期的说法是AsyncTask最初被引入的时候只支持一个任务同时运行,后期增加到了5个,我今天特意验证了一下看看: priv...
感谢红橙Darren博主 布局文件中 package com.
关键词:View ViewGroup ViewRootImpl invalidate是如何刷新view的? View /** * 必须可见才能刷新,运行于UI线程 * Invalidate the whole view.
OpenSL ES(Open Sound Library for Embedded Systems) 网上解释OpenSL ES是跨平台、针对嵌入式系统精心优化的硬件音频加速API。
关键词:PhoneWindow DecorView 在调用setContentView方法设置布局的时候,系统做了什么? 在AppCompatActivity中 @Override public void setContentView(@LayoutRes int layoutResID) { getDelegate().
D:\application\java\android-ndk-r10e\toolchains\arm-linux-androideabi-4.8\prebuilt\windows-x86_64\bin>arm-linux-androideabi-ad...
感谢红橙Darren博主 package com.rzm.commonlibrary.views; import android.content.Context; import android.
感谢红橙Darren博主 package com.rzm.commonlibrary.views; import android.content.Context; import android.
(创建于2017/10/16) 关键词: ActivityThread ApplicationThread IActivityManager IApplicationThread Instrumentation ActivityManagerServi...
不论你的activity是继承自AppCompateActivity还是Activity,最终startActivity都会走到Activity中的方法 默认设置参数bundl为null @Override public void startActivity(Intent intent) { this.