移动开发
文章平均质量分 63
小猪快跑22
专注于Java以及Android
展开
-
Android 下载安装APK踩坑纪录
最近项目中需要有个静默下载,下载完成后弹框告诉用户是否下载的需求。开始觉得 so easy!,真的调研写demo的时候发现过程还是蛮曲折的。下面会详细述说。原创 2023-04-07 10:14:02 · 1135 阅读 · 0 评论 -
Gradle 几种依赖方式的区别
一、implementation : 依赖项在编译时对模块可用,并且仅在运行时对模块的消费者可用。什么意思呢? 假设 A 依赖 B,B 以 implementation 方式依赖 C,那么 C 在编译和运行时都对 B 模块可用,即编译和运行时模块 B 都可以调用模块 C 中的代码。但是,模块 A 就无法调用 C 的代码,会在编译时报错。二、api : 依赖项在编译时对模块可用,并且在编译和运行时对模块的消费者都可用。 假设 A 依赖 B,B 以 api 方式依赖 C,那么 A 在编译和运行时原创 2022-05-01 10:45:58 · 1538 阅读 · 0 评论 -
Handler延时消息是如何实现的?
首先,需要明确一点,Handler 延时消息机制不是延时发送消息,而是延时去处理消息;举个例子,如下:handler.postDelayed(() ->{ Log.e("zjt", "delay runnable");}, 3_000);上面的 Handler 不是延时3秒后再发送消息,而是将消息插入消息队列后等3秒后再去处理。postDelayed 的方法如下:public final boolean postDelayed(@NonNull Runnable r, long d原创 2021-09-27 21:15:12 · 2964 阅读 · 0 评论 -
Android app 字体大小不随系统字体改变的方案
我们项目中的字体全都是设置成 sp。而 sp会随系统字体大小改变,而 dp不会随系统字体改变。如果把我们 app中字体格式全改成 dp,那不显示,所以就 google下,真的有很完美的解决方案。就是在BaseActivity中重写 getResources 方法: @Override public Resources getResources() { Resources resources = super.getResources(); Configuration原创 2020-10-28 15:22:06 · 732 阅读 · 0 评论 -
OKHttp3 Cookie 持久化
OkHttp3 的 Cookie 持久化其实网上的文章很多。我写这篇文章只是为了下次再做Cookie持久化的时候可以拿来就用。CookieJar 就是OkHttp3 提供用来获取Cookie的接口:很简单 该接口有2个方法,主要用来存Cookie和获取Cooki。public class MyCookiesJar implements CookieJar { private static final String TAG = "CookiesManager"; // 持久化的存储 Cook原创 2020-09-09 15:14:12 · 937 阅读 · 3 评论 -
Android 接口加签的使用
为什么要做接口加签呢,目的就是防止别人恶意估计,就是频繁的调用例如 发短信验证的接口,导致公司产生高昂的短信费用。那么接口加签就可以解决这个问题了,但是需要客户端和服务端约定好。以下就是加签的过程。步骤一:服务端给我们一个接口来获取RAS的公钥,或者将服务端的公钥写死在客户端。这里为了方便说明,我们是将公钥放在本地的。例如,我们拿到的密钥为:KEY = “kqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQDFCVD2j”然后 通过算法获取对应KEY 的密钥对象 RSAPri原创 2020-09-04 17:48:34 · 703 阅读 · 0 评论 -
不接入支付宝SDK情况下获取支付宝授权码
之前有个很蛋疼的需求,就是在不接入支付宝SDK的情况下获取支付宝授权码。总之是一直在调试支付宝的SDK是怎么跳转的,因为没有其他的办法;不能的App之间的跳转基本都是通过Intent隐式跳转来实现的。所以就需要看他传递了哪些参数,最终在IOS同学的帮组下找到了方法,因为ios能够拦截跳转到支付宝授权界面的参数,就抱着试试看的态度,然后发现是真的可行。下面贴出步骤:步骤1:在你的项目中,新建一个包名为 com.alipay.sdk.app 的activity, AlipayResultActivity;原创 2020-09-04 13:53:01 · 1810 阅读 · 0 评论 -
Retrofit2.0 上传视频的用法和上传大体积视频会OOM
用法很简单:我直接贴代码: @Multipart @POST("api/attch/cdn") fun upload(@Part vararg parts: MultipartBody.Part): Observable<BaseApiResult<UploadResp>> fun uploadVideo(file: File) : Observable<ZflBaseApiResult<UploadResp>> {原创 2020-09-03 18:17:25 · 1859 阅读 · 4 评论 -
Retrofit 的源码解析和实例说明
前言:Retrofuit 是基于OkHttp的一款网络请求库,可以让你简单到调用一个Java方法的方式去请求一个api,这样App中的代码就会很简洁,方便阅读。一、先来看看怎么使用的:1、定义一个接口,该接口指定请求类型(GET、POST、DELETE、PUT等),以及请求参数和接口返回的数据类型,如下:interface MyService { @GET("api/teacher"...原创 2020-04-09 15:56:31 · 215 阅读 · 0 评论 -
谈谈我对MessageQueue中的“同步屏障”的理解
谈谈我对MessageQueue中的“同步屏障”的理解同步屏障是什么同步消息和异步消息同步屏障有什么用处?同步屏障怎么删除同步屏障是什么同步屏障 就是一个空的消息(Message ),该Message 的 target 为 null,而同步消息的target就是 Handler,这是因为 Handler 发送消息的时候都会调用如下方法:```javaprivate boolean enq...原创 2019-12-13 14:49:49 · 763 阅读 · 0 评论 -
Android Binder 机制 实例分析
前言这里将讲述Binder机制的框架以及它是如何进行IPC通信的。一、Binder架构的组成1.1.Binder 框架 有3个方面组成: Binder服务端、Binder驱动以及客户端组成。Binder服务端:Binder 服务端实际上就是一个Binder 对象,该对象一旦创建就会开启一个隐藏的线程,该线程用来接收 Binder 驱动发送的消息,然后执行 onTransact函数,并根据 ...原创 2019-09-29 11:15:51 · 780 阅读 · 0 评论 -
Android 启动模式二---组合Flag和launchMode
之前的文章讲了4种launchMode启动的Activity的区别以及通过设置taskAffinity来新建一个任务栈(launchMode 是singleTask 或 singleInstance)一个实例让你理解android的4种启动模式几种主要的Flag1. Intent.FLAG_ACTIVITY_CLEAR_TASK该模式必须配合FLAG_ACTIVITY_NEW_TASK一起...原创 2019-07-25 16:29:44 · 1514 阅读 · 0 评论 -
OKHTTP3自定义CookieJar和及Cookie持久化
一、简介Cookie会包含如下信息:name expires domain path secure;name:cookie 的名字;expires:过期时间。值是一个日期,一个时刻,而不是一个时长。在OkHttp中,你可以使用该字段在端上建立逻辑,也可以忽略该字段依靠server实现过期的逻辑。domain:cookie的作用域,指定了cookie将要被发送至哪个域中。默认情况下,doma...原创 2019-03-04 18:00:44 · 9054 阅读 · 0 评论 -
android Activity 给 Fragment 设置回调的方法
这个实现方法很简单,可分为3步走:1.在fragment中定义接口2.在activity的定义时实现这个接口3. 在fragment中的 onAttach 方法中 将 Context 转为 相应的接口;代码如下:public class AllFragment extends Fragment {//......代码省略 @Override public ...原创 2018-12-26 17:56:43 · 2158 阅读 · 0 评论 -
android 6.0及以下获取wifi mac地址
Android 获取wifi mac地址的方法Android 6.0以下获取mac地址的方法如下: WifiManager mWifi = (WifiManager) getApplicationContext().getSystemService(Context.WIFI_SERVICE); if (mWifi.isWifiEnabled()) { ...原创 2018-10-19 09:49:01 · 995 阅读 · 3 评论 -
Retrofit2 获取post上传进度的坑点
最近项目需要知道上传进度,然后网上找方法,方法代码如下:/** * Created by za-zhujiangtao on 2018/8/23. */public class UploadFileRequestBody extends RequestBody { private RequestBody mRequestBody; private BufferedSin...原创 2018-08-29 14:40:20 · 917 阅读 · 0 评论 -
一个实例让你彻底明白Activity的4种启动模式
首先,我们得有一个概念,就是启动的Activity都是放在相应的任务栈中。按Back键的时候Activity会从任务栈中返回,当任务栈为空时系统就会回收这个任务栈。那么我们为什么需要这4中启动模式呢?我们新建Activity的并在Androidmanifest.xml文件中注册的时候,默认的就是standard模式,如果你在这个Activity中一直通过startActivity来启动这个Ac原创 2017-08-03 14:46:54 · 4627 阅读 · 4 评论 -
ImageLoader中自定义Displayer来展示任意圆角
ImageLoader自带圆角图片的RoundedBitmapDisplayer,但这个displayer展示的效果是4个角都是圆角,而我们有时候只需要其中的上面或下面2个角是圆角,本篇就是讲这个方法的。package com.uil;import android.graphics.Bitmap;import android.graphics.BitmapShader;import androi原创 2017-11-30 19:29:49 · 490 阅读 · 0 评论 -
Android 获取View的 left、right、top、buttom、以及x、y坐标的方法
xml文件如下:<?xml version="1.0" encoding="utf-8"?><AbsoluteLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent原创 2016-07-28 19:12:25 · 4951 阅读 · 0 评论 -
透彻理解 Java synchronized 对象锁和类锁的区别
synchronized 加到 static 方法前面是给class 加锁,即类锁;而synchronized 加到非静态方法前面是给对象上锁。这两者的区别我用代码来演示下:对象锁和类锁是不同的锁,所以多个线程同时执行这2个不同锁的方法时,是异步的。在Task2 中定义三个方法 doLongTimeTaskA和doLongTimeTaskB是类锁,而doLongTimeTaskC是对象锁。pub原创 2017-02-17 14:34:05 · 25741 阅读 · 9 评论 -
谈谈我对Android View事件分发的理解
写这篇博客的缘由。最近因为项目中用到类似一个LinearLayout中水平布局中,有一个TextView和Button,然后对该LinearLayout布局设置点击事件,点击TextView能够触发该点击事件,然而奇怪的是点击Button却不能触发。然后google到了解决办法(重写Button,然后重写其中的ontouchEvent方法,且返回值为false),但是不知道原因,这两天看了几位大神的原创 2017-01-24 10:46:25 · 1258 阅读 · 4 评论 -
从源码的角度分析Android消息处理机制
我们都知道Android的UI线程是非安全的,如果要在子线程中更新UI界面,出现会报错”Only the original thread that created a view hierarchy can touch its views.“。我们通常的做法是在UI线程中创建一个Handler,然后在子线程中通过sendMessage来更新UI。为什么这样做就可以呢?今天我们就通过源码来解释下。And原创 2016-03-08 11:41:02 · 493 阅读 · 0 评论 -
一个实例让你透彻理解Android ViewGroupe的事件分发
前言:ViewGroupe的事件分发是一个重点也是一个痛点,许多地方都会用到,尤其是滑动冲突时的解决,下面通过一个实例并结合源码来分析ViewGroupe的事件分发。前提是有一定的View事件分发基础,不熟悉的可以看我之前写的View的事件分发。自定义的Button:package com.zjt.touch;import android.content.Context;import androi原创 2017-01-23 15:57:21 · 604 阅读 · 0 评论 -
一个例子包含mvp、rxjava以及retrofit2的使用
前言:之前就学习了相关的知识,一直未结合使用,现在打算结合起来使用,这个例子就是包含mvp、rxjava以及retrofit2的基本用法。下一篇文章会基于这篇文章的基础介绍dagger2的用法。首先,在gralde文件中引入后续要用到的库://rxjava 以及rxandroid compile 'io.reactivex:rxjava:1.0.14' compile 'io.reactivex原创 2017-04-25 13:29:42 · 1869 阅读 · 0 评论 -
从源码的角度来说说 AsyncTask的问题
前言,之前就一直很想写这个内容,但一直没写,直到后来使用AsyncTask出现问题了,才去认真的查看源码,看了之后又怕忘记,所以写下来加深记忆并分享。 源码是 api-23中的。主要有几个问题:AsyncTask 是怎么在子线程中处理任务且能够回到主线程的?想想应该知道肯定是通过handler。还有AsyncTask能够取消正在执行的任务吗?带着这2个问题我们从源码上进行分析。先来看看AsyncT原创 2017-05-17 10:27:01 · 508 阅读 · 0 评论 -
最简单的自定义视频播放进度条
前言:之前有个需求是做一个播放的进度条,于是我在网上查找了一些文章,发现最终还是出入较大,没办法,还是自己写吧。先贴2张效果图: 当然了,我们产品的要求可不是这么简单,得是进度条的左上角显示播放视频的名称,右上角显示播放的总时长。但实现到这一步了,其他那2个需求就太简单了。难点嘛,你们看了设计图可能觉得没难点,但是当时对我来说就有一个难点,那就是绘制的字体在提示框的中间,查询了一些文章才做成最终效原创 2017-06-08 17:10:34 · 5898 阅读 · 0 评论 -
SwipeRefreshLayout +RecycleView实现上拉加载更多和下拉刷新
主要就是在上拉到最后一条数据的时候显示footerview,然后数据获取成功的时候调用 adpter的数据刷新即可。贴2张效果图:1.上拉加载更多: 2.下拉刷新: 代码不难,而且都有注释,有问题互相学习啊,直接上代码 RecycleViewAdapter.javapublic class RecycleViewAdapter extends RecyclerView.Adapter<Re原创 2017-06-08 17:40:34 · 1407 阅读 · 0 评论 -
一个简单却很炫的LoadingView
今天看到一个银行的APP上面的loadingview 挺好的,就尝试着自己实现,觉得很简单,但自己实现起来还是发现了一些问题。LoadingView和下图类似: 实现的代码也不是很复杂,就是小球的运动轨迹需要计算,我自己手画了个计算的图,很简单的就是三角函数的使用。 然后代码就是代码实现了,主要的内容都有注释,代码如下:ublic class LoadingView extends View {原创 2017-06-22 19:06:05 · 1112 阅读 · 0 评论 -
属性动画ValueAnimator源码解析
先来看一段代码,如下:ValueAnimator valueAnimator = ValueAnimator.ofInt(1, 100); valueAnimator.addUpdateListener(new AnimatorUpdateListener() { @Override public void onAnimatio原创 2017-07-07 17:23:26 · 872 阅读 · 2 评论 -
AIDL中的in、out、inout是什么?
之前写AIDL的时候就关注功能实现了,所有的形参的数据流都是默认的in。如下:ackage com.example.aidlserver;import com.example.aidlserver.Person;// Declare any non-default types here with import statementsinterface IMyAidlInterface {原创 2017-07-18 10:05:43 · 1149 阅读 · 0 评论 -
Activity传递对象集合到Fragment
因为 android.support.v4.app.Fragment 的构造函数是默认的: public Fragment() { }所以传递数据就比较麻烦啦,如果在该Fragment中有一个listview,但其中的数据(List)需要从MainActivity中传过来,要怎么做呢?可以通过序列化来实现:public class DataBean implements Parcelable原创 2017-07-17 19:30:25 · 4482 阅读 · 0 评论 -
android .9图片详解及应用
.9.png是干什么用的呢?这里我就不再说明了。 我们知道.9.png图片的上下左右都有1px宽度且长度任意的黑线,那么这些黑线的作用是什么呢?可以总结成一句话“左上拉伸,右下填充”,就是说左边和上边的黑色线条表示是可以拉伸的区域,右边和下边的黑线表示内容填充的区域。这么说,可能不是很好理解,下面会有例子加以说明。我们先来看张.9.png的图: 左边和上边的黑线对应可以拉伸的区域,黑线以外的区域原创 2017-08-08 14:59:05 · 1995 阅读 · 0 评论 -
快速发送多个广播且部分广播未按时回应的解决方法
前言:今天接到一个需求:就是在发出广播后1s内没有相应的话,就返回空的数据,但是等到广播数据回来后就不再处理了。咋一看很容易啊,Handler post delay 1s, 然后,然后设置标志位为true,在处理广播返回数据的时候根据标志位来判断是否要处理。但是我们的场景是可能用户1s内按了触发了3次,其中有的广播在1s内返回数据了,有的1s后才返回数据。所以之前的操作就不灵了。现在这里介绍下我的思原创 2017-07-28 10:01:55 · 671 阅读 · 1 评论 -
最好用的侧滑删除--SwipeLayout
前言: 项目中经常会用到类似于QQ侧滑点击删除的效果,网上的开源库也很多。个人感觉SwipeLayout最好用。下面介绍怎么使用。一、首先导入需要的Jar包,有3个,AndroidSwipeLayout-v1.1.8.jar、AndroidViewAnimations-1.1.3.jar、nineoldandroids-2.4.0.jar。第一个jar包就是我们使用该控件的jar包,后面2个是侧滑出原创 2016-04-19 17:46:12 · 6876 阅读 · 8 评论