自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(47)
  • 问答 (1)
  • 收藏
  • 关注

原创 Android倒计时

这两天做了一个功能,输入密码错误后要间隔一定时间才能再次输入,间隔时间要显示给用户,效果如下: 利用android已有的CountDownTimer实现;一开始的想法是继承CountDownTimer,构造函数中直接传入一开始显示的文字和结束后的文字,以及显示文字的控件,在这个类内部自己解析文字,把里面时间相关的,比如“1分钟”、“100秒”用剩余时间代替,时间变化时调用控件的setTe...

2018-03-01 17:03:29 718

原创 Android弹出悬浮窗引导用户开启应用设置

由于国产手机修改了android原生系统很多设置,在这些手机上运行app可能要做一些国产化的设置,最开始是在一个页面里做的,写得很详细,第一步要进入到设置,然后应用管理,选择应用,然后选择权限等等,可能用户都记不清楚了。下面改用弹出窗口的形式,可以在操作的时候看窗口中的提示,提供更好的用户体验。 效果如下: 感谢在线gif生成网址 https://ezgif.com/video-to-gi...

2018-02-08 16:48:01 11583

原创 Adnroid利用AIDL实现Service间的双向通信

网上相当多关于android利用AIDL实现进程间通信文章,基本上都是activity去bind一个service,然后调用客户端,也就是activity这边调用服务端的方法。但我心里一直有个疑问,这种模式是单向的,如何实现AIDL的双向通信?于是跑了下面的Demo。 大致原理是两个Service,Service1和Service2,Service1bind好Service2后,拿到Servic

2018-01-18 10:35:46 1015

原创 Android事件分发机制研究

写个Demo,分别调用一个Button的onTouch和onClick函数: bt1 = (Button) findViewById(R.id.bt1); bt1.setOnTouchListener(new View.OnTouchListener() { @Override public boolean on

2018-01-16 21:34:58 354

原创 app如何获取ANR时产生的trace文件

跑了个Demo程序,想把/data/anr/trace.txt文件拿到,然而普通app是无法获取该文件的,就算把手机root也不行。因为不知道进入anr文件的api,就直接使用路径创建文件,同时使用一个可以获取的文件做为对比,说明该刚发可行,确实是app拿不到trace.txt。先通过adb,进入app的外部存储路径看看有什么文件: 以ecmsLogger(java).log文件为例,

2018-01-11 17:23:14 6974 2

原创 在Android中使用注解

注解可以让代码更加规范,更具可读性。假如定义了一个函数 setName(String a),在activity中调用: 这里传了个null进去,但很多时候我们不希望传null,一旦参数为null希望能有提示之类的,这就要用到注解了。这里是官方文档:http://tools.android.com/tech-docs/support-annotations 添加依赖:dependencies {

2018-01-04 19:39:31 221

原创 Lock、synchronized、sleep和wait

Lock和synchronized区别: Lock能提供更多API,如trylock():返回true表示拿到锁,false表示没有拿到锁;trylock(long time, TimeUnit unit):定义超时时间,避免死锁;unlock():上锁后要在finally中调用unlock()去掉锁。sleep和wait的区别:两者对线程的占用不同,看下面的代码:public class C

2018-01-03 16:57:24 368

原创 notepad++使用正则表达式查找

参照:https://jingyan.baidu.com/article/b907e627b7feb146e7891cd6.html a.+?d表示:以“a”开始,后面是除了回车以外的其它字符,最后以“d”结束。 我们的app在自动化测试时进行了多次重复测试,我要在logcat中搜索同时包含了下面两个打印的进程:ecm_ui_service->UIService: onReceiveEventN

2017-12-21 15:28:22 17304

原创 实现Binder接口的异步通信

利用AIDL实现进程间通信默认是同步的,这样可能会导致阻塞的发生:如果另外一端处于异常状态将导致调用端处于等待状态。 昨天就遇到这样的问题,A、B两个app通过一个公共service通信,A在service中通过AIDL接口调用B中的方法:for (ISecAppCallback listner : mListener) { if (listner != null) {

2017-12-15 15:46:20 3717

原创 获取app相关路径下所有文件大小

应用管理中显示我们的应用占用了超过一个G存储空间,今天定位这些文件都是些什么文件写了个Demo,用于测试app自身产生了哪些文件,并计算这些文件大小。实用于没有Root的手机。 private static long getFileSize(File f) throws Exception { ECMLog.i_ecm(CLASS_TAG, "getFileS

2017-12-12 17:21:00 957

原创 一个Demo了解android中的hook技术

最近了解了下android中的hook技术,一段代码黑掉了activity的启动过程,Demo中涉及到framework层activity的启动机制,JAVA的反射+代理机制,不得不说掌握这个技术需要深厚的技术功底才行。文章地址:在这里,写这篇博客是记录下自己对其中用到的技术的理解。 调用startActivity会进入framework,然后通过IActivityManager对象的sta

2017-12-07 15:32:26 15476 6

原创 MVP+DownloadManager实现android下载功能

最近要重构下载部分的代码,想想这正好是一个典型的MVP模式实现的功能,看过网上很多MVP的例子,都是以登录为例,没有看到下载相关的,干脆按自己的理解写一个算了。M负责下载功能的具体实现; V就是activity; P负责M和V之间的交互;M和V都有自己的接口类,activity直接调用的是present,先上个工程截图: 一幅图描述它们之间的关系: 先分析下activity,当有新版本时,展

2017-11-15 11:11:37 681 1

原创 android中对launchMode和task的理解

网上太多关于launchMode的说法了,好多说法不一致,自己跑demo来验证一下。standard准备两个activity:MainActivity和Main2Activity,先不指定MainActivity的launchMode: 在oncreate和onResume加上打印: intent到自己:public void toMainActivity(View view){

2017-11-06 16:12:43 317

原创 android中AIDL机制分析

AIDL的使用通过AIDL接口实现下面的功能: 在一个页面中登录,activity只负责接口调用和参数传递,具体实现由service完成,service执行登录后把结果返回给activity。 首先需要新建一个.aidl文件,在里面申明AIDL接口方法:interface IEcmServiceBinder { /** * 登录TF卡 * 初始化加密卡并且获取当

2017-10-30 15:42:34 1036

原创 android中handler消息发送机制源码剖析

从官方推荐的handler用法说起:class LooperThread extends Thread { public Handler mHandler; public void run() { Looper.prepare(); mHandler = new Handler() { public void handleMes

2017-10-29 12:23:55 452

原创 一次代码合并事故

前几天做了一次git分支合并操作,昨天同事发现有几次提交没有合并上,今天上班发现真的是合并掉了。由于没在旧分支上提交过代码,当时合并好后让同事确认有没有漏掉的提交,他说没法一一检查,后来想想,其实有办法可以确认提交的代码,在此记录下以示警示。 分支合并的基本操作是,假如要把develop分支的代码合并到master上,先切换到master:git checkout master然后开始merge:

2017-10-27 10:55:08 628

原创 android使用tinker对app进行热修复

记录一下热更新流程,方便以后使用。

2017-10-25 11:53:35 432

原创 通过手机访问本地web应用

一直做android终端开发,对于服务器就是一小白,想尝试下服务器端的工作,就在本地搭建了个web应用。先下载Tomcat,然后运行,进入目录下的bin文件夹运行startup.bat: server起来了: 用浏览器访问:http://localhost:8080/ 看到下面页面说明server启动了: 如果想上传文件到web应用,进入\webapps\ROOT,放一个文件到该目录下,比

2017-10-19 18:19:34 3422 1

原创 android中RXJava的基本使用

整个Demo学习下RXJava。 直接上代码。 在gradle中添加依赖: compile 'io.reactivex:rxjava:1.0.14' compile 'io.reactivex:rxandroid:1.0.1'不控制线程package acxingyun.cetcs.com.rxjava;import android.app.Activity;import and

2017-10-11 16:54:01 801

原创 android中sqlite数据库的使用

用一个Demo程序完成sqlite数据库的增删查改。创建数据库和表android中使用SQLiteDatabase需要先实现SQLiteOpenHelper类:public class MyDatabaseHelper extends SQLiteOpenHelper { public static final String CREATE_BOOK = "create table " + Co

2017-10-09 19:54:29 975

原创 android自定义动画实现牛顿撞球

效果最近实现了一个不错的自定义view,类似在商店里看到的牛顿撞球,先上效果: 一个球摆动: 两个球摆动: 三个球摆动: 感谢mp4转gif网站,甩格式工厂10条街:https://ezgif.com/video-to-gif 一开始的想法就是做一个等待时的动画效果,好看的动画效果能让用户耐心等待,撞球是我比较喜欢的效果。使用小球个数、颜色、半径、摆动球个数、最大摆动角度等都可以使

2017-09-30 13:50:51 596

原创 system/priv-app和system/app

手机system目录下有两个文件夹:app和priv-app,手机被root后,通过adb push可以把apk推到这两个目录,作为系统apk用户无法删除。 它们的区别在于,priv-app中的service是不能被kill掉的,就算通过adb kill掉后系统会重新拉起: 图片太小,看不清楚,就是:Line 14879: 09-28 10:07:06.352 1624 2165 W

2017-09-30 11:36:28 21321 5

原创 多线程下调用SimpleDateFormat的问题

SimpleDateFormat类用于时间格式的处理:SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd", Locale.CHINA);// 输出北京时间String currentNetworkTime = "2017-09-19";Date date_from_network = Constants.sdf.parse(curre

2017-09-19 11:50:26 543

原创 android获取app父进程ID

在android.os.Process中可以直接获取当前应用的进程号:int pid = android.os.Process.myPid();在Process中是有获取父进程ID方法的,但是不能用: 通过反射来实现: //获取对应的类 Class<Process> processClass = android.os.Process.class; //

2017-09-15 17:15:04 1945

原创 app保存崩溃日志

大体思路“当一个线程突然终止,java虚拟机通过getUncaughtExceptionHandler可以得到这个线程的UncaughtExceptionHandler,并进入这个handler的uncaughtException方法。”所以我们 定义一个类实现当前线程的UncaughtExceptionHandler,并修改uncaughtException方法实现自己需要的功能。 定义一个C

2017-09-04 18:20:27 575

原创 在Ubuntu上配置ftp服务

在Ubuntu上配置ftp服务,参照下面: http://blog.csdn.net/nation_chen/article/details/7066277主要总结一下用户分组步骤。 新建一个用于保存文件的文件夹在/srv/ftp路径下: 只有读权限: 查看权限: 添加用户group: 添加用户到ftpusergroup,并指定用户目录为downloadFile,设置密码:u

2017-08-29 19:32:15 412

原创 使用glide加载背景图片内存消耗对比

以一个Demo对比activity背景在使用和不使用glide时的内存消耗。 在gradle中添加glide的依赖: compile 'com.github.bumptech.glide:glide:3.7.0'选择一幅图作为背景,540*960,37KB,不用glide,设置为背景 Drawable backgroundDrawable = getResources().ge

2017-08-23 18:56:13 1766

原创 运行react native

环境搭建和运行参照网上的教程安装一系列的工具,然后进入一个路径比如F盘,打开git命令行,输入:react-native init projectname会新建一个projectname的文件夹,之后进入该文件夹,在git中输入:react-native start等一会,显示下面提示说明服务起来了: 也可以点击下面链接看服务是否启动: http://localhost:8081/index

2017-08-03 19:08:34 726

原创 一次封装JNI时的崩溃

最近做一个app,需要调用同事提供的jni接口,封装过程中出现了一次崩溃,解决的时候顺便熟悉了下jni一些知识,在此记录下。 activity不是直接调用的jni,而是通过aidl接口和service通信,然后service来调用jni。有个接口要传入一个interface对象,下面是jni方法声明: public native int selfTest(MyCallback callbac

2017-07-31 11:25:51 649

原创 app被kill再次启动时系统会恢复被kill时的activity

当一个应用有activity存在时被kill掉进程,再次启动应用时系统会唤醒之前存在的那个activity。 在Mate8、Mate9上都存在这一现象,当初测试有一个用例就是测试应用被kill后的反应,会导致一系列的异常情况,主要是界面的异常。当时没有想到怎么解决这种情况,加上被kill需要root权限(做的项目是安全产品,用户root可能性小),bug级别也不是很高就搁置了。现在发现通过关闭权限

2017-07-25 14:43:10 1224

原创 说说封装sdk的那些坑(下)

之前介绍了修改sdk后的代码大体架构,其实修改代码倒不是什么麻烦的事,无非实现一种新功能,下面说说真正让人抓狂的事——封装和集成sdk。sdk打包首先要打包,如果是纯代码的sdk导出成jar包就行了;像我这样sdk里还包含图片资源要打包aar。编译成功用gradle直接打包成release包: 模块名称为downloadsdk,生成的aar就在download/build/out

2017-07-03 16:39:36 7205

原创 说说封装sdk的那些坑(上)

这半个月一直在做一件事,升级sdk的修改、打包、集成,移交给我的sdk源码是个半成品,效率低,逻辑混乱,好多代码是直接复制粘贴,连空格都没对齐。强迫症犯了,拿过来直接重新改造。对SDK的改造首先是一个显示新版本信息的DialogFragment,点击升级会启动一个service,service会启动一个downloadtask类,里面有一个成员变量List,DownloadThread继承了Thre

2017-06-30 15:48:56 5562

原创 andorid运行时添加断点调试

都知道androidstudio里的debug功能,点击后程序会重新运行然后停留在断点处。有时候程序已经在运行中,比如你已经输入了用户名、密码之类的,或者出现了偶现的bug,希望程序能停留在断点处,传统的debug功能就不实用了。这个时候就需要android studio里的“attach debuger to android process”功能了。 上面的一排button attach de

2017-06-30 13:58:04 394

原创 android控件快速定位

使用sdk提供的工具uiautomatorviewer可以快速定位某个页面某个控件的id。 连接手机打开app,运行sdk路径下的uiautomatorviewer,点击左上角第二个device screenshot,再点击某个控件,比如点击修改口令的按钮,在右边能看到详细属性:

2017-06-20 15:53:18 1283

原创 Android中使用AIDL接口实现进程间通信

AIDL接口可以实现进程间通信,现在这个项目中也使用到了,activity通过AIDL接口调用下层MainService的方法。现在自己又研究了一把,今天把用法和其中的原理记录下来。使用AIDL接口实现一个从activity传值给service的功能,activity和service要在不同进程。android studio新建project就有了MainActivity,然后创建一个AIDL文

2017-06-05 17:22:07 1214

原创 java synchronized测试程序

看了些网上相关的文章,感觉有些结果不对,于是自己跑了一遍这些demo并附上每段程序结果和一些心得。非线程安全的代码public class Run { public static void main(String[] args) { HasSelfPrivateNum numRef = new HasSelfPrivateNum(); ThreadA athread

2017-05-15 16:15:36 608

原创 适配器模式

适配器就是把已有的接口转变成需要的接口,比如笔记本利用电源适配器把220V电源转换成5V电源,下面是一种典型例子。220V电源可以输出220v电:public class Battery220 { public void output220(){ System.out.println("output 220v..."); }}借助适配器转换成需要的接口并实现 Ad

2017-05-12 16:11:21 213

原创 用MAT解决GridView引起的内存泄漏

用户反馈页面中用到了gridview批量上传图片,发现有内存泄漏,也没在网上找到关于gridview图片回收的方法,只有自己慢慢摸索,android studio导了一个又一个hprof,用MAT挨个分析,只要还存在图片类型对象又另外想办法,最后终于找到了回收的方法。 先看看代码:mGridView=(GridView) findViewById(R.id.gridview); m

2017-05-02 15:25:52 637

原创 利用图像处理工具分析MAT中的bitmap

看了不少用mat分析内存泄漏的文章,在工作中却一直没有机会真正用上mat。mat不是一个很直观的工具,还需要使用者有足够的内存优化经验。无意中发现一个工具GIMP,可以把数据以图片形式显示,再加上MAT可以把bitmap保存为数据文件,两个工具结合使用,可以很方便的定位项目中哪些图片文件是没有回收的。 以我在项目中实际遇到的一个问题说明,有下面这个button,background是一个selec

2017-04-28 16:44:03 1149

原创 仿微信用户反馈功能实现

现在的项目要增加一个用户反馈功能,由于是临时提出的需求也没有UI设计,就想到参照微信的设计来实现。 先看微信的效果: 在web端实现的,开始也想过做在web端这样更灵活,但目前的架构还是传统的纯native应用,这么搞太麻烦,估计要捣鼓一段时间,还是就用android端实现。功能分析用户点击添加图片按钮后在手机图片库中选择照片,选定后展示出来,最多选择4张,水平排列,一行不够排两行,就想到G

2017-04-25 15:58:02 2013 2

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除