Android
文章平均质量分 75
Mlib
这个作者很懒,什么都没留下…
展开
-
【Android】源码分析 - View事件分发机制
事件分发对象(1)所有 Touch 事件都被封装成了 MotionEvent 对象,包括 Touch 的位置、时间、历史记录以及第几个手指(多指触摸)等。(2)事件类型分为 ACTION_DOWN, ACTION_UP,ACTION_MOVE,ACTION_POINTER_DOWN,ACTION_POINTER_UP, ACTION_CANCEL,每个事件都是以 ACTION_DOWN 开始 ACT原创 2017-12-26 19:27:57 · 578 阅读 · 0 评论 -
【Android】Binder - 如何使用AIDL
一、跨进程通信为了演示方便,将Service与Activity处于不同的进程,可以在AndroidManifest.xml中,把service配置成android:process=":remote" ,也可以命名成其他的。AIDL(1) IRemoteService.aidl:定义Server端提供的服务接口// IRemoteService.aidlpackage com.cuc.myandro原创 2017-11-02 15:21:39 · 550 阅读 · 0 评论 -
【Android】阅读Android源码的一些姿势
本文转载自 阅读Android源码的一些姿势 — by Kaede日常开发中怎么阅读源码找到正确的源码IDE是日常经常用的东西,Eclipse就不说了,直接从Android Studio(基于IntelliJ Community版本改造)开始。我们平时的Android项目,都是要依赖Android SDK里对应API Level的android.jar包(而且是以Provided的形式依赖),这转载 2017-01-04 13:54:11 · 982 阅读 · 0 评论 -
【Android】源码分析 - Handler消息机制再梳理
前言多线程的消息传递处理,从初学Android时的Handler,懵懵懂懂地照猫画虎,到后来一头雾水的疑惑它为什么这么复杂,再到熟悉之后的叹为观止,一步步地都是自己踩过的足迹,都是成长啊哈哈哈。虽然离出神入化的境界还远十万八千里呢,但Android中的Handler多线程消息传递机制,的确是研发技术学习中不可多得的一个宝藏。本来我以为自己之前的学习以及比较了解 Handler,在印象中 Androi原创 2017-08-04 14:09:54 · 1773 阅读 · 1 评论 -
【Android】源码分析 - IntentService机制
前言提到Android的多线程机制,除了我们常用的Thread来实现异步任务之外,还有AsyncTask:封装了线程池和Handler,主要为了子线程更新UI;HandlerThread:一个已经拥有了Looper的线程类,内部可以直接使用Handler;IntentService:一个内部采用HandlerThread来执行任务的Service服务,任务执行完毕后会自动退出;今天我们来根据原创 2017-10-05 16:17:42 · 657 阅读 · 0 评论 -
【Android】源码分析 - AsyncTask异步任务机制
前言提到Android的多线程机制,常用的有如下几种方式:AsyncTask: 封装了线程池和Handler,为 UI 线程与工作线程之间进行快速切换提供一种便捷机制。适用于当下立即需要启动,但是异步执行的生命周期短暂的使用场景。HandlerThread: 一个已经拥有了Looper的线程类,内部可以直接使用Handler。为某些回调方法或者等待某些任务的执行设置一个专属的线程,并提供线程任务原创 2017-10-10 14:16:56 · 551 阅读 · 0 评论 -
【Android】Dialog异常CalledFromWrongThreadException深入分析
问题在使用Dialog时,因为线程问题,在调用dismiss方法时出现了CalledFromWrongThreadException的Crash,如下:android.view.ViewRootImpl$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch it原创 2017-10-27 09:40:21 · 2965 阅读 · 1 评论 -
【Android】app打包成apk文件以后,如何查看VersionCode、VersionName等版本信息
Android App打包成Apk后,其实是一个压缩文件,可以将后缀名apk改为zip然后用winrar打开也能看到里面的文件结构。还能看到AndroidManifest.xml。但是里面的内容经过编码显示为乱码,不方便查看。aapt工具: 这里我们可以使用aapt工具来查看。aapt.exe工具即Android Asset Packaging Tool,在SDK的build-tools目录下。原创 2015-12-25 10:57:13 · 23838 阅读 · 2 评论 -
【Android】EventBus 3.0 源码分析
概述EventBus是一个基于观察者模式的事件发布/订阅框架,开发者可以通过极少的代码去实现多个模块之间的通信,既可用于 Android 四大组件间通讯,也可以用于异步线程和主线程间通讯,而不需要以Interface回调、handler或者BroadCastReceiver的形式去单独构建通信桥梁。从而降低因多重回调导致的模块间强耦合,同时避免产生大量内部类。这是EventBus源码中的介绍:/**原创 2017-09-30 19:39:44 · 1545 阅读 · 0 评论 -
【Gradle】Android Studio中Gradle重复依赖的问题
问题项目中有个Module需要解析json所以选用了依赖Gson,但是编译时报错如下:Error:Execution failed for task ':app:transformClassesWithJarMergingForAutoioDebug'.> com.android.build.api.transform.TransformException: java.util.zip.ZipEx原创 2017-02-23 13:02:58 · 8033 阅读 · 2 评论 -
【Android】打印输出调用栈
1. Java层如何打印调用栈?在优化Android启动过程时,同事给出一种打印出调用栈的函数。分享一下:java.util.Map<Thread, StackTraceElement[]> ts = Thread.getAllStackTraces(); StackTraceElement[] ste = ts.get(Thread.currentThread()); for (Sta转载 2017-10-26 10:28:52 · 809 阅读 · 0 评论 -
小米4A安装App报错INSTALL_FAILED_VERSION_DOWNGRADE
问题这两天用小米手机debug,完全卸载之后发现总是报错INSTALL_FAILED_VERSION_DOWNGRADE或者INSTALL_FAILED_ALREADY_EXISTS,AS的命令行中显示:Unknown failure (Failure - not installed for 0) Error while Installing APKs按理说应用已经卸载了,很是奇怪,不论是从应用商店原创 2017-10-20 10:54:24 · 1630 阅读 · 0 评论 -
【Android】SDK和API Level版本的对应关系
这里记录一下android的SDK和API版本号之间的对应关系,方便以后的查看。例如以下的 build.gradle 配置文件指定了项目兼容的最低android API版本号:minSdkVersion 16,那么该项目兼容的系统版本就是Android 4.1.2以上的机型。apply plugin: 'com.android.application'android { compileSd原创 2015-11-24 11:08:16 · 18368 阅读 · 0 评论 -
【Android】Picasso加载本地图片如何清理缓存cache?
使用Picasso加载SD卡图片的时候,Picasso也会对该图片进行缓存。所以如果该图片即使已经变了,Picasso在加载时会仍然使用缓存,而不更新图片。Picasso缓存策略我们都知道图片缓存使用的是Map键值对存储的,这里的Key就是加载的图片的Url,所以如果我们使用相同的ImageUrl去加载图片的话,如果使用了缓存,Picasso会直接读取缓存的内容,而不是从SD卡、或者网络Http中原创 2016-03-08 15:03:45 · 12619 阅读 · 5 评论 -
【Android】自定义ImageView高度自适应,宽度成比例缩放
/** * 高度自适应ImageView,高度始终充满显示区域,宽度成比例缩放 */public class AutoHeightImageView extends ImageView { public AutoHeightImageView(Context context) { super(context); } public AutoHeightImag原创 2017-07-07 10:18:38 · 4401 阅读 · 2 评论 -
【Android】Monkey压力测试与停止
一、Monkey 是什么?Monkey测试是Android自动化测试的一种手段。该工具用于进行压力测试,就是模拟用户的按键输入,触摸屏输入,手势输入等,看设备多长时间会出异常。 然后开发人员结合monkey 打印的日志 和系统打印的日志,结局测试中出现的问题。二、Monkey命令1). 标准的monkey 命令 [adb shell] monkey [options] < eventcount >原创 2016-07-19 11:09:58 · 4840 阅读 · 0 评论 -
【Android】源码分析 - Activity启动流程
启动Activity的方式Activity有2种启动的方式,一种是在Launcher界面点击应用的图标、另一种是在应用中通过Intent进行跳转。我们主要介绍与后者相关的启动流程。Intent intent = new Intent(this, TestActivity.class);startActivity(intent);从Activity入手@Overridepublic void st原创 2017-12-23 19:07:28 · 900 阅读 · 0 评论 -
【Android】移动端接入Cronet实践
移动端接入Cronet实践QUIC协议获取Chromium源码编译CronetAndroid / iOS buildsDesktop builds (targets the current OS)Running the ninja files生成的文件使用CronetAndroid Debug LogSee VLOG(1) and VLOG(2) logging:See VLOG(1) loggi...原创 2019-07-30 12:42:50 · 7705 阅读 · 0 评论 -
【Android】ADB工具原理探究
ADB简介Android Debug Bridge (adb) 是一个Android的命令行工具。可以用来连接模拟器或实际的移动设备。比如 adb logcat, adb shell。Dalvik Debug Monitor Server(DDMS) 后台也是运行的adb来实现监控调试移动设备。总体而言,adb有两个用途:监控连接设备 :adb会监控所有已经连接设备(包括模拟器),譬如设...原创 2019-06-08 17:26:49 · 2542 阅读 · 0 评论 -
【Android】Doze模式识别与检测
从 Android 6.0(API 级别 23)开始,Android 引入了两个省电功能:Doze模式(官方翻译为低电耗模式)和 App Standby模式(官方翻译为应用待机模式),可通过管理应用在设备未连接至电源时的行为方式为用户延长电池寿命。Doze模式通过在设备长时间处于闲置状态时推迟应用的后台 CPU 和网络 Activity 来减少电池消耗。App Standby模式可推迟用户近期未与...原创 2019-05-27 10:33:56 · 2274 阅读 · 0 评论 -
【Java】J.U.C并发包 - AQS机制
简介Java并发包(java.util.concurrent)中提供了很多并发工具,这其中,很多我们耳熟能详的并发工具,譬如ReentrantLock、Semaphore,CountDownLatch,CyclicBarrier,它们的实现都用到了一个共同的基类 - AbstractQueuedSynchronizer,简称AQS。AQS提供了一种原子式管理同步状态、阻塞和唤醒线程功能以及队列...原创 2018-08-27 10:24:00 · 535 阅读 · 0 评论 -
【Android】动态链接库so的加载原理
前言最近开发的组件时常出现了运行时加载so库失败问题,每天都会有java.lang.UnsatisfiedLinkError的错误爆出来,而且线上总是偶然复现,很疑惑。所以本文将从AOSP源码简单跟踪Android中的动态链接库so的加载原理,试图找出一丝线索。加载入口首先我们知道在Android(Java)中加载一个动态链接库非常简单。就是我们日常调用的 System.load(...原创 2018-07-04 14:51:46 · 5652 阅读 · 0 评论 -
【Android】单元测试方法简介
前言基本单元测试框架Java单元测试框架:Junit、Mockito、Powermockito等;Android单元测试框架:Robolectric、AndroidJUnitRunner、Espresso等。最开始建议先学习Junit & Mockito。这两款框架是java领域应用非常普及,使用简单,官网的说明也很清晰。junit运行在jvm上,所以只能测试纯java...原创 2018-06-29 22:35:42 · 601 阅读 · 0 评论 -
【Android】Retrofit源码分析
Retrofit简介retrofit n. 式样翻新,花样翻新 vt. 给机器设备装配(新部件),翻新,改型Retrofit 是一个 RESTful 的 HTTP 网络请求框架的封装。注意这里并没有说它是网络请求框架,主要原因在于网络请求的工作并不是 Retrofit 来完成的。Retrofit 2.0 开始内置 OkHttp,前者专注于接口的封装,后者专注于真正的网络请...原创 2018-04-13 18:54:57 · 726 阅读 · 0 评论 -
【Android】App应用前后台切换的一种监听方法
Android本身并没有提供监听App的前后台切换操作的方法。最近看到一种简单巧妙的方法来监听前后台,这里分享记录一下。一、Activity生命周期我们知道在Android中,两个Activity,分别为A和B。假设此时A在前台,当A启动B时,他们俩之间的生命周期关系如下,可以参考之前的这篇文章【Android】Activity与Fragment的生命周期的关系: A.onPaus...原创 2018-04-06 20:13:39 · 4194 阅读 · 0 评论 -
【Java】线程池ThreadPoolExecutor实现原理
引言线程池:可以理解为缓冲区,由于频繁的创建销毁线程会带来一定的成本,可以预先创建但不立即销毁,以共享方式为别人提供服务,一来可以提供效率,再者可以控制线程无线扩张。合理利用线程池能够带来三个好处:降低资源消耗。通过重复利用已创建的线程降低线程创建和销毁造成的消耗。提高响应速度。当任务到达时,任务可以不需要等到线程创建就能立即执行。提高线程的可管理性。线程是稀缺资源,如果无限制的创建...原创 2018-02-13 17:34:17 · 10559 阅读 · 4 评论 -
【Android】OkHttp源码分析
Android为我们提供了两种HTTP交互的方式:HttpURLConnection 和 Apache HttpClient,虽然两者都支持HTTPS,流的上传和下载,配置超时,IPv6和连接池,已足够满足我们各种HTTP请求的需求。但更高效的使用HTTP 可以让您的应用运行更快、更节省流量。而OkHttp库就是为此而生。在开始分析OkHttp之前我们先了解一下 HttpURLConnection原创 2018-01-26 19:02:36 · 1014 阅读 · 0 评论 -
【Android】源码分析 - LRUCache缓存实现原理
一、Android中的缓存策略一般来说,缓存策略主要包含缓存的添加、获取和删除这三类操作。如何添加和获取缓存这个比较好理解,那么为什么还要删除缓存呢?这是因为不管是内存缓存还是硬盘缓存,它们的缓存大小都是有限的。当缓存满了之后,再想其添加缓存,这个时候就需要删除一些旧的缓存并添加新的缓存。因此LRU(Least Recently Used)缓存算法便应运而生,LRU是近期最少使用的算法,它原创 2018-01-13 11:20:29 · 4464 阅读 · 0 评论 -
用Java实现断点续传 (HTTP)
断点续传的原理其实断点续传的原理很简单,就是在 Http 的请求上和一般的下载有所不同而已。 打个比方,浏览器请求服务器上的一个文时,所发出的请求如下: 假设服务器域名为 www.sjtu.edu.cn,文件名为 down.zip。 GET /down.zip HTTP/1.1 Accept: image/gif, image/x-xbitmap, image/jpeg, i原创 2018-01-22 16:26:53 · 1341 阅读 · 0 评论 -
【Android】常用ADB命令总结
1. 获取当前运行的Activity方法一:adb shell logcat | grep ActivityManager 方法二:adb shell dumpsys activity activities 2. 安装包信息adb shell dumpsys package app-release_1.0.9.apk原创 2017-11-27 14:02:46 · 585 阅读 · 0 评论 -
【Android】判断应用Application、Activity、Service是否处于活动状态
通过ActivityManager我们可以获得系统里正在运行的activities,包括进程(Process)等、应用程序/包、服务(Service)、任务(Task)信息。1、判断应用App是否活动/** * 判断应用是否已经启动 * @param context 一个context * @param packageName 要判断应用的包名 * @return bool原创 2017-05-03 12:45:23 · 9728 阅读 · 0 评论 -
【Android】Audio音频输出通道切换 - 蓝牙、外放
手机音频的输出有外放(Speaker)、听筒(Telephone Receiver)、有线耳机(WiredHeadset)、蓝牙音箱(Bluetooth A2DP)等输出设备。在平时,电话免提、插拔耳机、连接断开蓝牙设备等操作系统都会自动切换Audio音频到相应的输出设备上。比如电话免提就是从听筒切换到外放扬声器,插入耳机就是从外放切换到耳机。场景需求Android系统自动切换的这些策略,并不能全部原创 2017-05-18 11:17:13 · 18039 阅读 · 10 评论 -
【Android】技术调研:用代码模拟屏幕点击、触摸事件
在Android中,有些场景需要使用代码来模拟人的操作,比如微信自动抢红包、UI测试等都需要模拟实现点击事件(Click)、触摸事件(Touch)、键盘事件(KeyBoard)等。那么,有没有现成的方案可以实现呢?答案当然是肯定的啦,往下看。经过调研发现,给系统模拟注入输入事件有如下几种方式: 一、使用shell命令使用android自带的adb shell,里面自带一个input工具,使用方法如原创 2016-06-02 11:55:53 · 42863 阅读 · 10 评论 -
【Android】adb 查看所有程序包名
adb shell pm list packages列出所有的包名$ adb shell pm list packagespackage:com.mediatek.mcopackage:com.android.providers.telephonypackage:com.android.providers.calendarpackage:com.android.providers.medi原创 2017-04-05 12:10:47 · 53700 阅读 · 3 评论 -
【Android】如何启动调用其他app中的Activity
最近项目正在将原系统拆分为小型App,所以需要在原Project中启动另一个新的App中的Activity。这样的话启动要用到ComponentName ,它就是用来打开其他应用程序中的Activity或服务的。原创 2015-09-15 12:19:01 · 5641 阅读 · 0 评论 -
如何删除多行首字母,Sublime Text多行编辑运用
在进行代码重用的时候会出现行号同时被复制的情况,原创 2014-05-15 17:06:38 · 18655 阅读 · 0 评论 -
【Android】App应用崩溃(Crash/Force Close)之后如何让它自动重启?
英文原文: Auto Restart application after Crash/Force Close in Android. 手机上的Android应用,经常会出现“Force Close”的错误,这种情况一般是因为代码中没有正确获取到Exceptions。那么如果想让App在出现这种错误崩溃Crash以后自动重启,我们改怎么办呢?这篇教程我们将学到如何自动处理Exception,翻译 2016-07-14 16:27:39 · 7433 阅读 · 2 评论 -
【Android】dip和px之间到底如何转换
在Android xml布局文件中,我们既可以设置px,也可以设置dp(或者dip)。一般情况下,我们都会选择使用dp,这样可以保证不同屏幕分辨率的机器上布局一致。 但是在代码中,如何处理呢?很多控件的方法中都只提供了设置px的方法,例如setPadding,并没有提供设置dp的方法。这个时候,如果需要设置dp的话,就要将dp转换成px了。一、名词介绍PPI = Pixels per原创 2016-07-22 12:02:04 · 3886 阅读 · 0 评论 -
Android Studio 快捷键操作指南
1、 Ctrl + Shift + 任意数字 添加bookmark书签,标记鼠标光标所在行,可以用作编辑器中快速跳转的操作。重新按下则取消书签标记。按住“Alt+对应数字”回到该数字所对应的bookmark所在行。 比如按下“Ctrl+Shift+5”,就会如下标记书签: 2、Ctrl + G find Usages. 查找调用3、Alt + Enter回车键 进行 “代码原创 2015-09-18 10:48:19 · 646 阅读 · 0 评论 -
【Android】如何查看Activity Task栈的情况
我们都知道,每个Activity都有taskAffinity属性,这个属性指出了它希望进入的Task。如果一个Activity没有显式的指明该 Activity的taskAffinity,那么它的这个属性就等于Application指明的taskAffinity,如果 Application也没有指明,那么该taskAffinity的值就等于包名。而Task也有自己的affinity属性,它的值等原创 2016-01-19 11:48:22 · 22542 阅读 · 0 评论