【Android】
文章平均质量分 81
viclee108
即使不能成为巨人,也要始终站在巨人的肩膀上
展开
-
自定义垂直滚动切换TextView
很多app的首页都会有一个用于显示热点消息的banner,通过垂直切换文本的方式动态展示消息。垂直切换的方式可以有效利用空间显示更多的内容,动态的效果也更能吸引用户的注意力。 实现这个效果,我能想到的方式大概有两种:1、继承一个LineLayout,在里面添加两个TextView,通过动画实现TextView的移动、显示、隐藏。2、继承TextView,手...原创 2016-03-03 00:41:33 · 7156 阅读 · 13 评论 -
Android应用内多进程分析和研究
正常情况下,一个apk启动后只会运行在一个进程中,其进程名为AndroidManifest.xml文件中指定的应用包名,所有的基本组件都会在这个进程中运行。但是如果需要将某些组件(如Service、Activity等)运行在单独的进程中,就需要用到android:process属性了。我们可以为android的基础组件指定process属性来指定它们运行在指定进程中。 有什...原创 2015-11-16 19:12:01 · 20498 阅读 · 15 评论 -
Android Service更新UI的方法之Messenger
上一篇文章我们讲解了怎样通过AIDL实现Service更新UI的功能,今天要讲的是另外一种方式:Messenger。它可以通过与Handler配合实现不同进程之间的通信,可以跨进程使用Handler发送消息。它的使用不像直接使用AIDL那么复杂,它只需要实现一个Handler对象来处理消息,其他的和使用普通的Service差不多。两个进程间可以通过Messenger来发送Messag...原创 2015-12-15 21:13:22 · 9062 阅读 · 0 评论 -
关于Android TaskAffinity的那些事儿
正常情况下,如果应用已经启动,并将应用切到后台,在通知栏中调起页面时,该应用的Task首先会被调起,然后会将我们的Activity显示在这个Task的顶端。手机百度的通知栏里面有一个快速搜索栏,无论什么情况下,点击之后都会直接弹出搜索页面,透明背景后显示的是桌面。怎么来实现这个功能呢?这就要提到我们的主角TaskAffinity了。什么是affinity?affinity是指Activity的归属,原创 2015-11-03 19:23:25 · 11082 阅读 · 1 评论 -
通过Python脚本读取apk信息
本文将主要介绍通过Python脚本检测apk信息的功能,介绍具体的实现之前,首先介绍一个Android SDK中的开发工具aapt。 aapt即Android Asset Packaging Tool,我们可以在Android SDK的platform-tools目录下找到该工具。aapt可以查看、 创建、 更新ZIP格式的文档,也可将资源文件编译成二进制文件,And...原创 2016-07-23 21:47:48 · 18852 阅读 · 0 评论 -
Android实现截屏的方法
Android要实现屏幕截屏,可以有很多方法,这里主要介绍两种常用的方法。一种是通过DrawingCache来生成截图,另外一种是通过Canvas,将View的内容绘制到Bitmap上。一、首先来看DrawingCache的使用方法。View控件上的内容可以通过cache机制保存为bitmap, 主要有以下方法:void setDrawingCacheEnabled(boolean...原创 2015-01-25 16:44:38 · 2526 阅读 · 0 评论 -
Android中用到的设计模式
Android系统使用Java语言进行开发,Android源码中设计模式的使用无处不在,以至于日常的开发中,也会根据不同的情况直接套用相应的设计模式。阅读Android源码的一大乐趣就是可以学习到Google大牛对设计模式的灵活运用。下面就来看一下Android系统都用了哪些常用的设计模式。模板方法模式 这应该是我们在Android开发中接触的比较早的设计模式。新...原创 2016-05-13 00:00:18 · 5377 阅读 · 3 评论 -
Android RelativeLayout和LinearLayout性能分析
LinearLayout和RelativeLayout是Android中最常用的两个布局容器,在分析它们的性能之前,我们先来看一个问题。 为什么使用Android Studio新建一个Blank Activity时默认的layout是RelativeLayout,而不是LinearLayout? 我觉得这是基于性能的考虑,使用 LinearLayout...原创 2016-05-22 14:32:58 · 4186 阅读 · 1 评论 -
Android图片适配问题分析
一些重要概念 首先来看一些Android屏幕适配相关的基本概念:屏幕尺寸:单位为英寸(inch),也就是我们常说的手机屏幕是多少寸。这个尺寸指的是屏幕对角线的长度。分辨率:屏幕高和宽的像素数, 现在常见的分辨率有640*480、1280*720、1920*1080。px:像素,显示屏上的一个光点就是一个像素。dp(dip):设备无关像素,Android上特有的一种度...原创 2016-05-04 21:15:56 · 4530 阅读 · 0 评论 -
贝塞尔曲线在Android中的应用
今天要讲解的内容是Android中贝塞尔曲线的应用。可能很多人对贝塞尔曲线不甚了解,这里先对它的概念做一下简单介绍。 贝塞尔曲线由多个点组成:起始点、终止点以及0到n个相互分离的中间点。根据中间点的不同,可以分为线性贝塞尔曲线、二阶贝塞尔曲线、三阶贝塞尔曲线和高阶贝塞尔曲线。一般的矢量图形软件通过它来精确画出曲线,贝塞尔曲线由线段与节点组成,节点是可拖动的支点,线段像...原创 2016-05-14 21:25:38 · 5447 阅读 · 7 评论 -
Android应用通用线程
在Android中,我们可以通过手动开启多个线程来异步处理耗时任务。其实在应用启动之后,除了主线程外,应用本身还会启动其他几个通用线程,这些线程通常称为管家线程。通过Eclipse的DDMS,我们可以看到下面几个线程,根据不同的Android版本,实际情况可能略有差异。 下面分别说一下这几个线程。main:就是我们说所知道的主线程ActivityThread,我...原创 2015-09-01 09:52:49 · 4375 阅读 · 0 评论 -
Android插件换肤功能实战
Android App实现换肤有多种思路,有的是通过内置资源的方式,有的是通过设置相同签名并且AndroidManifest.xml中配置相同android:sharedUserId使得两个apk运行在同一个进程中来互相访问数据。但是这些方式都有其局限性,实现不够灵活。今天来聊一下通过插件的方式换肤的原理及实现。 这种实现方式的大概思路是这样的:1)创建宿主工程,...原创 2016-04-08 00:53:22 · 2977 阅读 · 0 评论 -
Android弹幕效果实现
在B站或者其他视频网站看视频时,常常会打开弹幕效果,边看节目边看大家的吐槽。弹幕看起来很有意思,今天我们就来实现一个简单的弹幕效果。 从直观上,弹幕效果就是在一个ViewGroup上增加一些View,然后让这些View移动起来。所以,整体的实现思路大概是这样的:1、定义一个RelativeLayout,在里面动态添加TextView。2、这些TextVie...原创 2016-02-25 15:08:42 · 14587 阅读 · 12 评论 -
100行代码实现Activity右滑退出
很多Android App上已经增加了Activity右滑退出的效果,这个功能通常可以叫做SwipeBackActivity。这个效果最早来源于iOS,这样的操作优化确实提升了用户体验。在github上大概看了一下,实现很多也比较复杂。本文将介绍一种简单的方法来实现这个功能,只需在页面中调用两行代码就可以轻松搞定,对页面基本没有侵入性。 先来看一下最终的效果图...原创 2016-04-13 20:18:14 · 5537 阅读 · 9 评论 -
Android匿名共享内存和MemoryFile
今天要讲的内容相对冷门,日常开发中的使用率较低。但是,在某些场景下,它也许可以带给我们一个新的思路,帮我们解决一些棘手的问题,因此我觉得有必要谈一谈Android中的匿名共享内存(Ashmem)。 首先来看一下什么是匿名共享内存(Ashmem)。Ashmem是一种共享内存的机制,它利用了Linux的mmap系统调用,将不同进程中的同一段物理内存映射到进程各自的虚拟地址...原创 2016-11-14 21:10:48 · 15231 阅读 · 0 评论 -
Android无法显示超大图问题的探索
最近在做图片浏览功能时遇到了一个很蛋疼的问题,在开启硬件加速情况下,超大图无法正常显示(图的长宽有一个大于9000),而且程序不会crash,只是图片加载不出来,View显示为黑色。通过查看日志,发现系统打印出了下面的内容: W OpenGLRenderer( 4014): Bitmap too large to be uploaded into a texture (6...原创 2016-08-22 22:44:08 · 4871 阅读 · 1 评论 -
一个常见Android崩溃问题的分析
这个错误大家应该都有遇到过:IllegalStateException: Can not perform this action after onSaveInstanceState。最近又遇到这个问题,就想要梳理一下其中的一些细节。 我的具体使用场景是在一个AsyncTask的回调onPostExecute中调用了FragmentTransaction的commit方...原创 2019-05-28 23:34:13 · 1760 阅读 · 0 评论 -
SharedPreferences最佳实践
Android开发中,我们经常会用到SharedPreferences,它是一种轻量的数据存储方式,通常用来存储一些简单的配置信息。看了网络上的一些文章,感觉都不是特别满意,因此希望能结合自己的经验和理解写一篇分析SharedPreferences的文章。本文不会讲解SharedPreferences的基本用法,而是会结合源码来分析SharedPreferences的工作原理,以及...原创 2019-01-08 23:48:13 · 674 阅读 · 2 评论 -
Android视频开发基础(五)
今天这篇文章我们来讲点实用的内容。我们在进行需求开发的同时,有时候也需要去排查一些问题,今天就来讲讲我们可以借助哪些工具来分析和处理视频文件。由于本人使用的是mac,讲解均以mac为例。 今天主要讲解的几个工具是ffmpeg、ffprobe、qt-faststart和AtomicParsley。 ffmpeg ffmpeg是一套用来记录、转换音...原创 2018-12-23 23:04:02 · 2452 阅读 · 4 评论 -
Android视频开发基础(三)
接着之前两篇文章继续来讲Android视频开发这个主题。今天这篇文章,我们来聊一聊Android中MediaPlayer的DataSource。也许有的同学会觉得奇怪,DataSource有什么好讲的,我们直接调用MediaPlayer的setDataSource方法不就可以了。其实我们要讲的是更深层次的问题:怎么来干预视频播放器获取数据的过程。要解释这个问题,首先我们先来看看原生...原创 2018-12-07 17:06:14 · 2430 阅读 · 0 评论 -
Relinker源码分析
作为源码分析的第一篇文章,我们先从一个相对简单的开源库开始:Relinker。这库由来已久了,github也有1000+的star。我在工作中虽然有用到这个库,却一直没仔细看过源码,今天我们就来分析一下。 开始之前先来讲讲背景。 开发中我们常常会遇到这样的异常:java.lang.UnsatisfiedLinkError: Couldn’t load ...原创 2018-12-03 10:23:55 · 5469 阅读 · 2 评论 -
你不知道的Bundle
Bundle基本概念 在Android中,Bundle主要用于传递数据,它是以键值对的形式保存数据。我们经常使用Bundle在Activity之间传递数据,数据类型可以是基本类型或它们对应的数组,也可以是对象或对象数组。当Bundle传递的是对象或对象数组时,必须实现Serializable或Parcelable接口。 根据Android的设计,同一应用的Activity可...原创 2016-05-07 19:28:57 · 2929 阅读 · 2 评论 -
Android视频开发基础(一)
最近项目中实现了短视频的功能,主要包括视频的编辑处理、上传和播放。这是第一次真正略深入的接触视频开发,项目中接触到许多新的概念,也踩了很多坑,整体感觉视频处理还是十分复杂的知识体系,需要花大量的精力和时间才能很好的掌握这项技术。 下面就谈一谈其中涉及到的一些基础内容,也作为对之前工作的回顾。 基本概念码率 码率就是数据传输时单位时间...原创 2017-03-16 00:04:44 · 23650 阅读 · 10 评论 -
Fragment中调用getActivity为null的问题
在使用fragment的时候经常会遇到getActivity()为null的情况。比如我在一个异步网路请求的回调中调用了getActivity()就会出现空指针问题。之前解决这个问题,通常都是直接加空指针判断来规避,但是这并没有真正解决问题。 很多人都曾被这个问题所困扰,如果app长时间在后台运行,再次进入app的时候可能会出现crash,而且fragment会有重叠现象。如果系...原创 2015-09-24 19:30:35 · 38563 阅读 · 16 评论 -
Android视频开发基础(四)
前面几篇文章介绍了视频技术中最基础的概念以及Android中关于视频处理的一些知识,这些都是Android视频功能开发必须掌握的基础。这一篇文章作为这个系列的第四篇,主要来介绍直播相关的概念。 在这篇文章中,你可以学习到以下内容:1.当前直播产品的现状和面临的挑战2.直播系统的整体架构是怎样的3.直播客户端的结构如何4.常用的直播协议有哪些,他们有什么...原创 2018-12-17 21:28:57 · 2448 阅读 · 0 评论 -
Android VideoView播放本地视频短暂黑屏的解决方法
新的大版本终于正式发布了,整整三个月,做的心力交瘁,导致好久都没有更新文章了。最近接触了许多新的知识,也算是忙碌中有所收获。希望接下来的时间工作上能够稍微松缓一些,让我可以利用在家的闲余时间把一些内容整理总结,慢慢消化一下。今天首先来谈一谈前段时间遇到的一个关于ViewView的问题。 VideoView在Android视频播放中很常用,用法也比较简单。但是,我...原创 2017-03-14 21:34:24 · 34340 阅读 · 17 评论 -
Android视频开发基础(二)
前一篇文章详细介绍了视频的一些基本概念,这些内容与Android系统本身没有密切关系,只是作为熟悉视频领域的一个基础,便于介绍接下来关于Android上视频处理的其他内容。继续来看Android上视频相关的内容。 Android支持的格式 先来看一下Android官网上给出的Android系统支持的文件格式。 从图中我们可以看到 ...原创 2017-03-20 23:34:06 · 4832 阅读 · 11 评论 -
Android反编译和二次打包实战
作为Android开发者,工作中少不了要反编译别人的apk,当然主要目的还是为了学习到更多,取彼之长,补己之短。今天就来总结一下Android反编译和二次打包的一些知识。首先声明本文的目的是为了通过例子讲解反编译和二次打包的原理和方法,继而作为后续讲解防止二次打包和App安全的依据,并不是鼓励大家去重新打包别人的App,盗取他人劳动成果。 本文首先介绍几种Androi...原创 2016-04-14 00:33:26 · 23362 阅读 · 5 评论 -
Activity切换中生命周期的交互
参考google文档:http://developer.android.com/guide/components/activities.html 当一个Activity启动另一个Activity时,它们都经历了生命周期的切换。第一个Activity被暂停和终止时,另一个Activity被创建。这时,第二个Activity被创建之前,第一个Activity是不能完全被终止的。当在同一个进程中的翻译 2015-07-09 15:28:57 · 2822 阅读 · 2 评论 -
EditText限制输入字符类型的几种方式
最近的项目上需要限制EditText输入字符的类型,就把可以实现这个功能的方法整理了一下:1、第一种方式是通过EditText的inputType来实现,可以通过xml或者java文件来设置。假如我要设置为显示密码的形式,可以像下面这样设置:在xml中, android:inputType="textPassword"在java文件中,可以用 myEditTex原创 2014-10-31 15:22:43 · 60140 阅读 · 3 评论 -
AsyncTask的缺陷和问题
在Android开发中,AsyncTask可以使得用户避免直接使用Thread类和Handler 来处理后台操作,适用于需要异步处理数据并将数据更新到界面上的情况。AsyncTask适用于后台操作只有几秒的短时操作。但是AsyncTask本身存在很多糟糕的问题,如果使用中不注意,将会影响程序的健壮性。1、生命周期 很多开发者会认为一个在Activity中创建的As...原创 2015-05-21 20:09:03 · 25444 阅读 · 7 评论 -
android4.4上通知媒体文件更新的方式
通常在我们的项目中,可能会遇到写本地文件,最常用的就是图片文件,在这之后需要通知系统重新扫描SD卡, 在Android4.4之前也就是以发送一个Action为“Intent.ACTION_MEDIA_MOUNTED”的广播通知执行扫描。如下: this.sendBroadcast(new Intent(Intent.ACTION_MEDIA_MOUNTED, Uri.转载 2015-01-27 23:04:02 · 4807 阅读 · 2 评论 -
Android开发中使用Icon Font
IconFont字体不仅仅流行语Web开发,在移动开发中也渐渐的使用的范围更广泛。这里介绍在Android开发中使用icon font的代码和方法。应用步骤:1、第一步:复制字体文件到项目 assets 目录;2、第二步:打开 iconfont 目录中的 demo.html,找到图标相对应的 HTML 实体字符码;3、第三步:打开 res/values/st转载 2014-11-24 17:51:39 · 8687 阅读 · 0 评论 -
android中LocalBroadcastManager的使用
今天遇到一个acitivity之间通信的问题,由于我们是用TabActivity包裹了Activity(我们称之为A),所以这两个Activity是同时存在的。当在TabActivity中启动其他Activity处理一些业务,当业务处理完成时,通过onActivityResult()返回处理结果,我们需要根据返回的结果对A进行更新,但是现在问题就来了,我们怎么来更新A呢? 我发现Ta原创 2014-11-07 01:27:16 · 6241 阅读 · 0 评论 -
android的硬件加速
从Android 3.0开始,Android的2D渲染管线可以更好的支持硬件加速。硬件加速使用GPU进行View上的绘制操作。硬件加速可以在一下四个级别开启或关闭:ApplicationActivityWindowViewApplication级别往您的应用程序AndroidManifest.xml文件为application标签添加如下的属性即可为整个应用程序开启转载 2014-11-05 23:09:41 · 1147 阅读 · 0 评论 -
android控件显示顺序控制
在android中如果首先在xml中静态添加了一个控件,剩下的控件都是通过addView动态添加,那么如果有控件覆盖的情况(比如说使用FrameLayout或者RelativeLayout),先加入得控件就会被后加入得控件覆盖。在View类中有这样一个方法 bringToFront ,它得注释如下: /** * Change the view's z order in原创 2014-10-24 11:54:45 · 18375 阅读 · 1 评论 -
使用GameBench进行android性能测试
今天发现了一款android上很好用的性能测试软件,原创 2014-11-26 16:13:16 · 18393 阅读 · 1 评论 -
安装apk时的INSTALL_FAILED_DEXOPT错误
今天打包时,发现2.3机器,产生的APK在某些机器上不能安装(Installation error: INSTALL_FAILED_DEXOPT),针对这个问题的一个可能解释是:最新的ADT和SDK Tool在将jar转化成dex的时候,可能会合并类的代码,这将导致巨大的类;类中的每一个方法都分配有一个id,字节码中以id标识和调用方法;早期的Dalvik VM内部使用short类型变量来标识转载 2014-11-18 23:46:01 · 14133 阅读 · 0 评论 -
android ListView嵌套的处理方法
昨天开发遇到一个很诡异的问题,项目的需求需要在一个list原创 2014-11-08 11:34:17 · 1318 阅读 · 0 评论 -
android的EditText字数检测和限制
控件EditText在android布局中经常用到,对EditText中输入的内容也经常需要进行限制,我们可以通过TextWatcher去观察输入框中输入的内容。public class TextWatcherDemo extends Activity { private TextView mTextView; private EditText mEditTex原创 2014-10-25 16:09:08 · 16459 阅读 · 0 评论