Android 随笔
fomin_zhu
8年开发经验,精通Java后端和Android移动端
展开
-
PopupWindow返回参数至Activity两种方式:接口和Rxjava
使用Rxjava回调参数至Activity定义一个继承PopupWindow的类public class PopupWindows extends PopupWindow implements View.OnClickListener { public PopupWindows (View parent, final Context context) { super(conte原创 2015-12-25 00:02:56 · 2965 阅读 · 0 评论 -
JNI和NDK基础
引言JNI是Java Native Interface(Java本地接口),是为了方便Java调用C和C++等本地代码所封装的一层接口。NDK是Android提供的一个工具集合,通过NDK可以在Android中更加方便地沟通JNI来访问本地代码。两者之间的关系:JNI是实现目的,NDK是在Android实现JNI的手段。使用NDK有如下好处:提供代码的安全性可以很方便的地使用目前已有...原创 2018-11-28 16:16:10 · 943 阅读 · 0 评论 -
使用Retrofit2+RxJava2+ProtoBuf实现网络请求
引言Retrofit 是一个用于 Android 和 Java 平台的类型安全的,底层使用OkHttp实现网络请求框架。Retrofit 通过将 API 抽象成 Java 接口而让我们连接到 REST web 服务变得很轻松。RxJava 提供一套异步编程的 API,这套 API 是基于观察者模式的,而且是链式调用的。Protocol Buffers 是一种轻便高效的结构化数据存储格式,可以...原创 2018-12-14 10:52:48 · 1335 阅读 · 0 评论 -
ConstraintLayout使用
引言ConstraintLayout是一个ViewGroup,允许您以灵活的方式定位和调整小部件的方法,项目中的布局嵌套问题对项目性能有着不小的威胁,布局能实现扁平化的话会让软件性能得到很大的提升,而ConstraintLayout就是为了解决布局嵌套问题,提示项目的性能。官文有详细对比ConstraintLayout的性能优势。使用方式:implementation 'com.andr...原创 2018-12-07 10:18:01 · 874 阅读 · 0 评论 -
Android Lifecycle使用
引言Lifecycle 是官方提供的架构组件之一,目前已经是稳定版本,Lifecycle 组件包括LifecycleOwner、LifecycleObserver。Lifecycle 组件是执行操作以响应另一个组件(Activity或者Fragment)的生命周期状态的更改。 Lifecycle 生成更易于组织、更轻量级,更易于维护的代码。不使用Lifecycle在使用MVP模式中,如果需要...原创 2018-12-15 21:43:50 · 3052 阅读 · 3 评论 -
Retrofit2 原理解析
Retrofit是什么官网介绍是A type-safe HTTP client for Android and Java,是一个 RESTful 的 HTTP 网络请求框架的封装,但网络请求不是Retrofit来完成的,它只是封装了请求参数、Header、Url、返回结果处理等信息,而请求是由OkHttp3来完成的。入门Retrofit入门非常简单,首先需要在build.gradle引用相关...原创 2018-12-27 10:21:23 · 1077 阅读 · 0 评论 -
Activity的生命周期和启动模式
一、Activity生命周期onCreate:Activity正在创建,生命周期的第一个方法,需要setContentView加载layout。onRestart:Activity正在重新启动,当前Activity从不可见重变为可见的姿态下,onRestart就会被调用。onStart:Activity正在启动,这时Activity已经可见了,但是还没有出现在前台。onResume:Ac...原创 2019-01-06 23:03:15 · 672 阅读 · 0 评论 -
Android使用OkHttp WebSocket
什么是WebSocketWebSocket是一种在单个TCP连接上进行全双工通信的协议。它使得客户端和服务器之间的数据交换变得更加简单,允许服务端主动向客户端推送数据。在WebSocket API中,客户端和服务器只需要完成一次握手,两者之间就直接可以创建持久性的连接,并进行双向数据传输。Websocket使用和 HTTP 相同的 TCP 端口,可以绕过大多数防火墙的限制。默认情况下,Web...原创 2019-01-07 10:57:12 · 16574 阅读 · 2 评论 -
Android LiveData使用
LiveData是一个可观察的数据持有者类。 与常规observable不同,LiveData是生命周期感知的,当生命周期处于STARTED或RESUMED状态,则LiveData会将其视为活动状态,这意味着它尊重其他应用程序组件的生命周期,例如Activity,Fragment或Service。LiveData具有以下优点:UI和数据保持一致:遵循观察者模式,生命周期状态更改时,LiveD...原创 2019-01-17 21:13:17 · 3451 阅读 · 3 评论 -
Android Service解析
Android Service是一个可以在后台执行长时间运行操作而不提供用户界面的应用组件,它分为两种工作状态,一种是启动状态,主要用于执行后台计算;另一种是绑定状态,主要用于其他组件和Service的交互。需要注意的两点:两种状态是共存的,即Service可以是启动状态也可以同时是绑定状态防止ANR风险,主线程运行的Service在执行耗时操作,则应在服务内创建新线程来完成这项工作,这可以...原创 2019-01-14 22:14:33 · 877 阅读 · 0 评论 -
Android BrocastReceiver解析
简介BroadcastReceiver(广播接收器)是Android四大组件之一,是一个用来响应系统范围内的广播组件,可以从Android系统和其它app发送或接收广播消息,类似于发布 - 订阅设计模式。其特点是异步的,广播发送者不会关心有无接收者接收。可应用于不同组件之间的通信、多线程通信和系统在特定情况下的通信。原理对于不同的广播类型,以及不同的BroadcastReceiver注册方...原创 2019-02-27 10:42:47 · 1349 阅读 · 0 评论 -
Android Navigation使用
简介Navigation导航编辑器旨在简化Android开发中导航的实现,可以帮助我们很好的处理Activity和fragment之间通过FragmentTransaction交互的复杂性,也可以很好的处理页面的转场效果;Deeplink的支持,绕过activity直接跳到fragment;并且传递参数更安全。在Android Studio3.2可以使用。基本使用引用相关依赖imple...原创 2019-03-07 16:58:35 · 1509 阅读 · 0 评论 -
Android Room使用
简介Room库在SQLite上提供了一个抽象层,允许在充分利用SQLite的功能的同时进行更健壮的数据库访问。可以在运行的app设备上创建一个应用数据缓存,这个缓存作为app的唯一数据来源,不管用户是否有连接网络,都允许用户在app中查看相关信息。Room有三个主要的组成部分:Database,Entity,DAO。Database:数据库容器,并作为到应用程序的持久关系数据的底层连接的...原创 2019-05-06 11:44:18 · 4160 阅读 · 0 评论 -
Android多平台推送
1、概述android push集成了小米,华为,魅族,vivo和oppo五大厂家的push sdk,方便Android各项目集成push。2、Push类图3、Push时序图4、使用姿势配置global.gradle和build.gradle在project的build增加配置allprojects { repositories { maven {ur...原创 2019-07-27 16:13:21 · 1600 阅读 · 4 评论 -
重温Acticity和Fragment生命周期
重温下Android和Fragment生命周期,理解生命周期方法的作用,什么时候调用,可以做一些什么操作。1、Android生命周期1.1 生命周期图1.2 生命周期函数说明onCreate:Activity正在创建,生命周期的第一个方法,需要setContentView加载layout。这里不建议耗时操作,只做layout和控件初始化。此方法传递一个 Bundle 对象,可以获取上一...原创 2019-08-31 08:31:38 · 928 阅读 · 1 评论 -
gradle tool升级到3.0注意事项
Gradle版本升级其实当AS升级到3.0之后,Gradle Plugin和Gradle不升级也是可以继续使用的,但很多新的特性如:Java8支持、新的依赖匹配机制、AAPT2等新功能都无法正常使用。Gradle Plugin升级到3.0.0及以上,修改project/build.gradle文件:修改global.gradle(自定义lib管理的gradle)tools = [...原创 2018-02-06 22:08:00 · 832 阅读 · 0 评论 -
RxJava1升级到RxJava2的注意事项
1、package更改rx1包名由原来的rx.xxx更改为io.reactivex.xxx,并且在同一个module之下,rx1和rx2是不兼容的。2、背压支持RxJava在1.0只有一个个观察者模式,只能部分支持背压:Observable(被观察者)/Observer(观察者) Observable(被观察者)/Subscriber(观察者)RxJava在2.0出现了两个观察...原创 2018-03-09 15:22:00 · 880 阅读 · 0 评论 -
Android组件化搭建
什么是组件化为了降低项目耦合性,在Android工程中如何实施,目前有两种途径,也是两大流派,一个是组件化,一个是插件化。在这里只介绍组件化,插件化暂不介绍正常的APP只有一个application的module和多个libary的module,而组件化开发是为了多个module都可以是application单独运行,发布时在合并。代码解耦APP:作为主的application的入口...原创 2018-03-09 15:25:00 · 838 阅读 · 0 评论 -
RxJava的学习笔记
RxJava的学习笔记RxJava 在 GitHub 主页上的自我介绍是 “a library for composing asynchronous and event-based programs using observable sequences for the Java VM”(一个在 Java VM 上使用可观测的序列来组成异步的、基于事件的程序的库)。这就是 RxJava ,概括得转载 2015-12-22 15:35:45 · 617 阅读 · 0 评论 -
Android ThreadPoolExecutor线程池
引言Android的线程池概念来自于Java的Executor,真正的线程池实现为ThreadPoolExecutor。在Android中,提供了4类不同的线程池,具体下面会说到。为什么使用线程池呢?而不是使用Thread创建线程呢?因为使用线程池有以下几个优点:重用线程池的线程,避免因为线程的创建和销毁所带来的性能开销 能有效控制线程池的最大并发数,避免线程之间抢占资源导致阻塞 能够...原创 2018-11-20 17:18:00 · 873 阅读 · 0 评论 -
Android线程
1、引言在Android中,几乎完全采用了Java的线程机制,由于Android的特性,主线程只处理和界面相关的事情,子线程处理耗时操作。Android中扮演线程角色的有Thread、AsyncTask、IntentService和HandlerThread。对于AsyncTask来说,底层用到了线程池,对于IntentService和HandlerThread,底层用到了线程。2、Asy...原创 2018-11-20 16:07:00 · 1244 阅读 · 0 评论 -
Android消息机制
概述 Android UI是线程不安全的,如果在子线程中尝试进行UI操作,程序就有可能会崩溃,因为在ViewRootImpl.checkThread对UI操作做了验证,导致必须在主线程中访问UI,但Android在主线程中进行耗时的操作会导致ANR,为了解决子线程无法访问UI的矛盾,提供了消息机制。void checkThread() { if (mThread != Thre...原创 2018-11-14 15:25:00 · 913 阅读 · 0 评论 -
Android8自定义广播无法收到消息
在Android 8之前,如果要发送自定义的静态广播,做好其他配置后,只需实例化一个Intent对象intent,然后将其作为参数传入sendBroadcast()方法中即可,例如Intent intent = new Intent(action);intent.putExtra(INTENT_DATA_PUSH, data);intent.addCategory(context.g...原创 2018-11-01 18:11:00 · 1478 阅读 · 0 评论 -
Activity正确获取View宽高
在View的measure完成后,一般可以通过getMeasureWidth/getMeasureWidth方法可以正确的获取View的宽高,而在特殊情况下,可能需要多次measure才能确定最终的测量宽高,onMeasure无法获取正确的宽高,但可以在onLayout方法中获取测量宽高。而在Activity生命周期方法中,是无法通过getMeasureWidth/getMeasureW...原创 2018-11-01 18:01:00 · 713 阅读 · 0 评论 -
Android Interpolator(插值器)
1、概述插值器定义如何计算动画中的特定值作为时间的函数。例如,指定动画在整个动画中线性发生,这意味着动画在整个时间内均匀移动,或者指定动画以使用非线性时间,例如,在开始或结束时使用加速或减速动画。Android中提供的Interpolator主要以下几个:| 类 | 资源ID | 说明 |----|----|----| AccelerateDecelerateInterpolator |...原创 2018-09-26 10:13:00 · 996 阅读 · 0 评论 -
Android属性动画
1、属性动画介绍属性动画在指定的时间长度内更改属性(对象中的字段)值。 要为某些内容设置动画,请指定要设置动画的对象属性,例如对象在屏幕上的位置,要为其设置动画的时间长度以及要在其间设置动画的值。属性动画扩展了Animator类,包含ObjectAnimator、ValueAnimator、AnimatorSet。属性动画系统具有以下特征:持续时间(Duration):指定动画的持续时...原创 2018-09-19 11:47:00 · 894 阅读 · 0 评论 -
Android View动画
Animation框架定义了透明度(AlphaAnimation)、旋转(RotateAnimation)、缩放(ScaleAnimation)和位移(TranslateAnimation)几种常见的动画,并提供了AnimationSet动画集合。实现原理是每次绘图时View所在的ViewGroup中的dispathDraw,流程如下图:可以看下ViewGroup的drawChild方法,...原创 2018-09-18 11:36:00 · 857 阅读 · 0 评论 -
IPC机制
1、IPC简介IPC是Inter-Process Communication的缩写,进程间通信或者跨进程通信,是指两进程之间进行数据交换的过程。在Android中,UI是主线程,其可以操作界面元素,但耗时操作放在UI线程处理会导致ANR错误。2、多进程模式2.1、开启多进程通过四大组件制定android:process属性,可以开启多进程模式,例如:<applicati...原创 2018-09-17 22:56:00 · 899 阅读 · 0 评论 -
Android性能优化建议
Android性能优化主要从卡顿、内存泄漏和崩溃、代码质量和逻辑、安装包过大四方面入手。在使用时避免出现卡顿,响应速度快,减少用户等待的时间,满足用户期望;同时减低 crash 率和 ANR 率,不要在用户使用过程中崩溃和无响应;节省流量和耗电,减少用户使用成本,避免使用时导致手机发烫;安装包小可以降低用户的安装成本。1、卡顿优化Android 系统每隔 16ms 发出 VSYNC 信号,...原创 2018-09-17 22:55:00 · 855 阅读 · 0 评论 -
Android自定义Aop的Gradle Plugin
[上一篇文章]中讲解了如何在Android使用AOP,会发现在Gradle配置aop会比较麻烦,每个module使用了aop都需要配置。接下来看如何简化配置。1、创建Module首先,需要建立一个Android Library,命名为aop-plugin,如图:2、删除文件由于plugin是由groovy进行创建的,需要删除红色框内的文件3、更改gradle把module里面的buil...原创 2018-09-17 22:54:00 · 958 阅读 · 0 评论 -
Android使用AOP
这里不讲aop的概念,网上资料很多,这里只讲如何配置aop和自定义plugin。1、使用场景在android中,有些业务是公共的,例如:登录判断、获取权限、网络判断等一些公用的业务逻辑,这些都可以使用aop编程。在未使用aop的时候,登录可能会像下面那样写:工具类:ASUtils/** * 如果未登录,返回true,并且跳转到登录页 * * @return boolean */...原创 2018-09-17 22:39:00 · 911 阅读 · 0 评论 -
Only fullscreen activities can request orientation
问题当我们把targetSdkVersion升级到27,buildToolsVersion和相关的support library升级到27.0.2后,在Android 8.0(API level 26)上,Activity出现了一个莫名其妙的crash,异常信息如下:java.lang.RuntimeException: Unable to start activity ComponentIn...原创 2019-09-02 21:28:47 · 799 阅读 · 0 评论