
Android
文章平均质量分 58
RickyXE
这个作者很懒,什么都没留下…
展开
-
JNI学习:在Java中保存Native对象引用
在学习Android Framework源码时,发现部分类中声明了这个变量:private int mPtr; // used by native code那么native层是怎么使用这个变量的呢?以Framework中的MessageQueue为例,它的Native模块源码为/frameworks/base/core/jni/android_os_MessageQueue.cpp查看其中的代码,可以发现这几个调用:// Java 层的MessageQueue构造函数中,会调用Native中的这原创 2020-05-29 15:51:47 · 1331 阅读 · 0 评论 -
JNI入门教程:最小环境HelloWorld实战
JNI是Android应用开发中不太常涉及的技术,但在Framework层中却被广泛使用。作为一名Android应用开发人员,学习JNI知识,对理解整个系统原理还是有很大帮助的。学习JNI有很多途径:可以直接阅读Framework源码。这种方案不太好上手验证,因为Framework代码要配置的编译环境还是比较复杂的,而且编译后没法直接运行测试,需要Root系统其次也可以下载安装NDK,直接在Android Studio里开发项目。这种方式也有比较多的环境配置工作,并且操作起来比较麻烦。因此这篇文原创 2020-05-26 17:54:45 · 536 阅读 · 0 评论 -
Handler发送消息后消息队列的处理
在Android中使用Handler不仅可以直接post发送消息,还可以通过postDelayed设定延迟时间,来延迟执行消息任务。那么这后面的机制是如何处理的呢?首先查看Handler的源码,会发现post和postDelayed内部均调用的同一方法sendMessageDelayed:public final boolean post(Runnable r){ return sendM原创 2017-02-09 18:21:52 · 4009 阅读 · 0 评论 -
Android中使用加速度传感器
在Android中使用加速度传感器可以帮助我们识别手机的姿态及运动状态。 使用加速度传感器与其他传感器的方法大致相同,通过调用系统API就可以实现。分为以下几步: 1.获取SensorManager 2.使用SensorManager获取加速度传感器 3.创建自定义的传感器监听函数,并注册 4.相对应的,在合适位置实现注销监听器的调用简单的代码如下:public class MainAct原创 2016-09-22 01:25:23 · 18388 阅读 · 0 评论 -
okhttp异常: java.lang.IllegalStateException: closed
09-05 14:42:17.606: E/AndroidRuntime(28219): Caused by: java.lang.IllegalStateException: closed09-05 14:42:17.606: E/AndroidRuntime(28219): at okhttp3.internal.http.Http1xStream$ChunkedSource.read原创 2016-09-06 18:14:50 · 21265 阅读 · 12 评论 -
MacOS下编译Android源码报错:Can not find SDK 10.6 at
Can not find SDK 10.6 at /Developer/SDKs/MacOSX10.6.sdk这个问题出错的log如下:android-4.4.4_r2.0.1 carl$ lunch aosp_x86-engbuild/core/combo/mac_version.mk:38: ***************************************************原创 2016-08-02 14:48:28 · 7205 阅读 · 0 评论 -
Android网络编程实例
这次简单的通过使用okhttp和node.js来实现Android与服务端交互。使用node.js作为服务端是因为其配置和开发都比较简便,在windows平台上也能很快搭建起环境;在开发Android应用时,这种快速构建的“后端”,可以用来在真正的服务端开发完成前,Mock后端数据,来验证应用网络接口的正确性。原创 2016-05-17 15:42:55 · 1878 阅读 · 0 评论 -
Android SDK中的自动化测试
Android中的测试手段非常丰富,通常上,按测试运行环境来划分,可以分为本地单元测试与Instrument测试: 运行环境 测试类型 PC机 本地Unit Test Android手机或模拟器 Instrument Test这两种类型测试源码在工程的位置分别为: 测试类型 对应目录 本地Unit Test mod原创 2016-08-11 18:14:26 · 6804 阅读 · 0 评论 -
ListView中的局部刷新
在列表中显示多个下载进度条是一个很常见的需求了, 这个需求主要涉及到以下两个技术点: 1.Handler异步更新UI 2.ListView进行局部更新今天来看一下这一功能最简单的实现——模仿多个APP下载更新进度条。 为了让代码简单一些,在这里使用了ListView显示列表,直接使用线程控制进度更新。首先,来创建一个AppItem的类在ListView中显示项目:public class A原创 2016-08-31 19:33:12 · 2234 阅读 · 0 评论 -
Android中的IPC——AIDL方式
AIDL是实现Android中IPC的一种方式。 通过AIDL我们将各种通信操作以接口方式进行定位,Android SDK则会按照AIDL的规则将AIDL编码成java类嵌入到应用中,然后我们就可以在APP运行时以调用函数的形式来进行IPC了。实际Messenger进行IPC本质也是以AIDL方式实现的,只不过通过上层接口封装我们不用自己实现AIDL的接口定义。Messenger与AIDL的原创 2016-08-09 22:35:11 · 687 阅读 · 0 评论 -
Android 6.0动态权限 Runtime Permission API使用
Runtime PermissionAndroid 6.0版本引入了动态权限获取机制(Runtime Permission),并引入了新的API来让开发者使用这一功能。 开发者使用相应API后,系统会自动弹出对话框,提示用户授予权限。在以往的Android版本中,checkPermission接口主要是读取Manifest文件中的权限声明,来判断当前应用权限的;对于很多手机内置手机管家中的权限管理原创 2016-05-17 17:28:12 · 1790 阅读 · 0 评论 -
Activity启动流程
1.自定义的Actitiy类初始化工作在onCreate中 2.onCreate是回调函数,在Activity抽象类中应有直接调用的地方 3.查找Activity源码,在performCreate(5230行)处 4.查找framework源码,发现Activity的performCreate函数是在Instrumentation类中callActivityOnCreate函数中被调用 5.原创 2016-10-29 14:52:04 · 920 阅读 · 0 评论 -
将异步API改成同步调用
有时候为了满足需求,我们需要在自己的类中进行线程管理/开启线程,并回调我们自己封装好的回调方法。例如:public void someTask() { new Thread() { @Override public void run() { int n = yourObject.someApi(); onGetR原创 2017-01-16 01:02:13 · 8172 阅读 · 0 评论 -
Android中使用Kotlin协程代替RxJava封装网络请求
现在的Android项目普遍使用Retrofit+RxJava的组合实现网络接口请求与数据的展现。这一功能通过Kotlin语言的协程功能也可以很方便的实现。相比较而言,RxJava功能过于强大,如果仅用于封装网络请求,有些杀鸡用牛刀的感觉。使用Kotlin的协程实现这个需求代码更精简,逻辑也更清晰一些。以下是一个完整的例子。使用Retrofit结合Kotlin协程,实现网络请求。点击Acti...原创 2019-06-10 18:41:55 · 9655 阅读 · 3 评论 -
使用Node.js+Express搭建App开发调试Server
在开发手机端App时,通常会出现移动端新页面开发的差不多了,后台接口还没Ready,导致前后端联调浪费了大量时间。 联调过程中又往往涉及到测试服务的切换、抓包验证以及测试异常数据等测试。进而涉及到App重新打包,配置Charles等抓包工具,后台改数据等等工作,非常麻烦。今天就使用Node.js实现一个用来调试的server,简化这些调试工作。这个server涉及到以下几个功能: 1. ...原创 2018-05-22 20:13:18 · 4421 阅读 · 0 评论 -
升级Retrofit2遇到的POST请求中Content-Type字段问题
最近将项目中的Retrofit由1.9升级到2.3版本。 在没有更改请求配置的情况下,发现请求头的Content-Type不一样了。通过抓包查看请求, 1.9版本POST请求的Header字段Content-Type:application/x-www-form-urlencoded; charset=utf-82.3版本POST请求Header字段Content-Ty...原创 2018-04-04 11:17:04 · 19819 阅读 · 1 评论 -
Kotlin中的构造函数
假设有个Person类,含有两个属性name和age先看一个Java版本public class PersonJava { private final String mName; private final int mAge; public PersonJava(String name) { this.mName = name; this.mAg原创 2017-11-14 17:03:02 · 12051 阅读 · 0 评论 -
Java获得范型类型class
Java很多框架或库中都会提供具有范型的回调接口或抽象类。当我们在使用时,代码类似于:MyClient.getInstance().handleEvent(new MyCallback<SomeEntity>() { @Override public void onSuccess(SomeEntity entity) {原创 2017-09-14 12:50:44 · 2307 阅读 · 0 评论 -
Java中的动态代理
在实际的项目开发中,会大量的用到代理模式。这一设计模式又与面向切面编程(AOP)紧密相关。 Java中可以通过静态代理或动态代理两种方式实现代理模式。其中静态代理容易理解,但由于需要编写大量代理类及代理方法代码,非常不利于维护;而动态代理的代理类在运行时生成,也不用编写大量重复性代码,相比静态代理有很大的优势。动态代理涉及一个重要的接口InvocationHandler以及一个重要的类Proxy,原创 2017-05-03 19:05:53 · 552 阅读 · 0 评论 -
Android通讯录的管理(联系人的增删改查)
Android中的联系人存储是通过ContentProvider实现的。因此APP对系统通讯录进行操作涉及到ContentProvider接口的使用。通讯录存储常用的数据库表使用有关接口前,首先了解一下通讯录数据库中常用的数据库表: 表名 表用途 contacts 联系人表,存储了实际的联系人姓名,头像,最后通话时间等信息。\n会对实际的联系人数据进行一定去重。 raw_原创 2017-03-01 17:25:07 · 21813 阅读 · 1 评论 -
Android Studio中的单元测试
在最新版Android Studio(2.1)中,已经可以方便的使用Mockito进行含有android api的单元测试了。因此可以更好的进行敏捷开发与持续集成测试。创建单元测试在Android Studio中新建工程,目录结构如下图显示: 其中 androidTest目录是Instrumentation Test的工程代码 main即App工程代码 test就是单元测试工程代码。编写原创 2016-06-30 11:46:58 · 6005 阅读 · 0 评论 -
Gradle仓库配置
Android Studio使用Gradle构建app。Gradle的使用非常灵活,其中可以设置使用多种类型的仓库,来获取应用中使用的库文件。 支持的类型有如下几种: 类型 说明 Maven central repository 这是Maven的中央仓库,无需配置,直接声明就可以使用。但不支持https协议访问 Maven JCenter repository JCenter原创 2016-07-18 17:30:42 · 37820 阅读 · 1 评论 -
Java中实现自定义的注解处理器(Annotation Processor)
在之前的《简单实现ButterKnife的注解功能》中,使用了运行时的注解实现了通过编写注解绑定View与xml。由于运行时注解需要在Activity初始化中进行绑定操作,调用了大量反射相关代码,在界面复杂的情况下,使用这种方法就会严重影响Activity初始化效率。而ButterKnife使用了更高效的方式——Annotation Processor来完成这一工作。Annotation Pr原创 2016-07-25 19:42:49 · 21899 阅读 · 6 评论 -
ListView中的ViewHolder模式及其作用
ViewHolder是ListView,GridView中常用的优化方案。以往看到很多文章,将缓存View与ViewHodler的使用放在一起来讲,但实际使用ViewHolder是有明确的目的和作用的。原创 2016-04-18 16:57:51 · 5457 阅读 · 0 评论 -
LayoutInflater两个inflate方法的区别
LayoutInflater类中有多个inflate方法,这里简要说一下:原创 2016-04-06 18:09:56 · 1303 阅读 · 0 评论 -
Android中使用代码控制Wifi及数据连接网络开关
有时我们需要在APP中控制WIFI和数据连接的开关,在Android中,是有相应的接口可以实现这一功能的。 控制WIFI开关控制WIFI开关需要使用WifiManager这一系统服务。首先我们通过代码获取到它:WifiManager wifiManager = (WifiManager) mContext.getSystemService(Context.WIFI_SERVICE);通过WifiM原创 2015-12-10 23:00:28 · 20568 阅读 · 7 评论 -
简单实现ButterKnife的注解功能
今天简单实现一个类似ButterKnife注解的功能——通过注解的方式,简化代码中View变量与XML资源绑定的流程。 ButterKnife使用的是CLASS级别的注解,在这里短平快,使用RUNTIME注解来模仿,会损失运行时性能。首先,我们来看一下ButterKnife典型的使用场景:@InjectView(R.id.title_text)TextView mTitleTextView;@O原创 2016-05-11 18:19:04 · 1799 阅读 · 0 评论 -
Android中使用HorizontalScrollView横向滑动布局
在Android中,ListView通常用来实现纵向滚动的列表,而HorizontalScrollView则可以实现横向滚动的列表项。引入HorizontalScrollView控件很简单,例如在一个LinearLayout中:<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tool原创 2015-12-05 13:52:30 · 36675 阅读 · 3 评论 -
Android View的可见属性
在Android中,View的可见属性是由xml中android:visibility属性指定的,此外,还可以通过view的setVisibility(int visibility)方法动态设定。这个属性总共有三个值:VISIBLE,INVISIBLE,GNOE,其含义与性质分别如下: 属性值 意义 visible view正常可见 invisible view隐藏不可见,但会原创 2015-12-29 00:02:39 · 605 阅读 · 0 评论 -
Android获取屏幕宽高信息
在Android中获得屏幕的宽高信息,可以通过DisplayMetrics类实现。在Activity的onCreate()函数中添加如下代码:// 声明DisplayMetrics对象,并获得当前屏幕的MetricsDisplayMetrics dm = new DisplayMetrics();getWindowManager().getDefaultDisplay().getMetrics(原创 2015-12-28 23:13:46 · 522 阅读 · 0 评论 -
Android中开启布局边界
在开发Android UI时候经常需要打开布局边界调试UI程序。但我们在开发时候经常遇到开发者选项里没有此项设置的机器,真是无语……在这里汇总一下目前已知的打开布局边界的方法:1.直接在设置中得开发者选项中打开。(别忘记先要点击5次系统信息里的版本号,开启开发者模式)2.如果手机的开发者选项没有这一项……打开命令行,通过ADB连接手机shelladb she原创 2015-09-18 15:06:32 · 9583 阅读 · 0 评论 -
自定义View中的动画
今天研究了一下自定义View中的动画。 绘制View中的动画可以使用Animation来实现,例如我们要实现动态绘制一个圆圈,绘制的主要代码使用canvas接口:public void drawArc(@NonNull RectF oval, float startAngle, float sweepAngle, boolean useCenter, @NonNull Paint paint)我们原创 2016-04-27 18:16:57 · 1668 阅读 · 0 评论 -
Android自定义View读取XML属性详解
今天研究了一下自定义View中XML属性的解析。首先,我们在声明自定义View时,会直接声明构造函数:public XCustomView(Context context, AttributeSet attrs)构造函数接受了一个context变量和一个attrs变量,我们使用attrs就可以解析XML属性了。 这里通常使用的方法是声明一个TypedArray变量,通过context.obtain原创 2016-04-20 14:09:56 · 7390 阅读 · 0 评论 -
Android.mk学习笔记
LOCAL_PATH := $(call my-dir)这条语句出现在Android.mk最开始。由于我们将所有源码等文件都存在了当前目录或子目录,因此调用my-dir这个函数来告知编译器所编译的模块在mk所在当前目录下。LOCAL_MODULE这个参数是模块的名称,要求全局唯一并且不能带空格。 可以简单试验一下,找到任意一个模块的目录,例如device/generic/goldfish,这是虚拟原创 2016-08-02 19:05:19 · 2464 阅读 · 0 评论 -
Android Studio导出jar包
首先来看一下Android Studio默认Project中的app module,以及可创建的Android Library以及Java Library两种module的差异: module gradle plugin 生成文件格式 是否可使用SDK API app com.android.application apk 可以使用 Android Library原创 2016-07-04 14:10:57 · 1638 阅读 · 0 评论 -
Fragment与Activity交互--Handler方式
Fragment与Activity交互有很多种实现方式。其中一种常用方法是通过Handler消息处理实现。那么在谁的类中实现Handler呢?规则很简单: 谁想被控制,就在谁的类中实现Handler。在另一方中得到这个Handler对象,来实现单向交互。例如很典型的应用场景: Activity需要响应返回键事件,并改变Fragment中状态。那么Fragment就是被控对象, 需要在Fragm原创 2016-08-02 01:10:45 · 1999 阅读 · 0 评论 -
Service Intent must be explicit错误
在Android 5.0以上版本,Intent必须声明为显式,否则会报Service Intent must be explicit错误,解决的方法很简单,在Intent中设定需要响应此Intent的包信息就可以了:Intent intent = new Intent();intent.setAction("YOUR_ACTION");intent.setPackage("TargetPacka原创 2016-07-20 11:01:00 · 460 阅读 · 0 评论 -
Android Studio中的多渠道包开发
今天来看一下Android Studio中的多渠道打包功能。主要应用到了Gradle中的Product Flavors配置。首先建立一个普通的APP工程。创建好后默认的结构如下: 可以看到默认包含main这一主干版本。 接下来加入我们向发布一个Foo的渠道版本,需要对工程进行配置。 结合网上查到的资料和我的实践,简要来说有以下几个注意点:1.最新的Android Studio已经可以通过图形原创 2016-07-05 15:00:26 · 3269 阅读 · 3 评论 -
onTouchListener中的onTouch函数
今天来研究一下onTouch函数的返回值。首先在一个ImageView中添加一个监听器:mImageView.setOnTouchListener(new View.OnTouchListener() { @Override public boolean onTouch(View v, MotionEvent event) { Log.i(TAG, "o原创 2016-06-28 17:41:19 · 3216 阅读 · 0 评论 -
Android Service使用速记
启动与停止Service启动&绑定Service:public ComponentName startService(Intent service)public boolean bindService(Intent service, ServiceConnection conn, int flags)停止&解绑Service:public boolean stopService(Intent na原创 2016-06-28 11:39:32 · 496 阅读 · 0 评论