![](https://img-blog.csdnimg.cn/20201014180756919.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
Android 小题
Young_Time
车无轮马无粮,产品经理提防提防
展开
-
Android 线程通信 —— Handler 使用
Android 线程通信 —— Handler 使用Android 应用是一个多线程应用,Android 有一个主线程,在没有特定指明线程的前提下,你执行的代码都是在 Android 主线程中运行。一般来说 Android 的 View 绘制是在主线程中完成的,所以如果我们在主线程中进行耗时操作时,线程无响应就会导致 UI 绘制等其它用户所看到的东西和执行的操作卡住,给用户带来不好的体验。所以 Android 中规定了 ANR(Application Not Responding:应用无响应)。ANR原创 2020-09-08 17:16:57 · 491 阅读 · 0 评论 -
AndroidX 迁移步骤,一篇就够了
AndroidX 迁移2018 年 I/O 大会后,Google 宣布将 Support Lib 重构为 AndroidX 的计划,随后便在 Support Lib 28 上进行了重构。然而因为后续不会在 Support Lib 上修复 bug 或者发布新功能,而且 Support Lib 和 AndroidX Lib 在项目中会互相冲突,所以我们不可避免的要进行 AndroidX 迁移。此篇文章就是笔者进行 AndroidX 迁移时的步骤和踩过的坑,希望可以帮到你。新建分支或者备份项目因为 Andr原创 2020-07-24 18:18:24 · 3349 阅读 · 0 评论 -
使用 Fresco 展示 Gif,控制播放次数,拿着就能用
我们在开发中经常会做一些 Gif 展示,而一些开源的图片框架如 Glide、Fresco、GifImageView 也能够展示 Gif,GifImageView 可以直接设置播放次数,而 Fresco 好像并没有设置播放次数的,就需要我们自己来处理。 首先,要使用 Fresco 就得先依赖,注意两个版本得一致:implementation 'com.facebook.fresco:fresco:1.5.0'implementation 'com.facebook.fresco:animat...原创 2020-05-20 18:21:06 · 1418 阅读 · 0 评论 -
如何防止系统弹窗被多次调用
在日常的开发中,我们经常会使用到 Dialog、PopupWindow、Toast 等,为了防止重复点击多次弹出,我们可以使用单例、或者定时器,配合 isShow() 的方法能很好的解决这个问题。那么系统的弹窗呢?比如 Intent 分享,我们没有弹窗打开关闭的回调,也不能做弹窗的单例,那我们要怎么解决这个问题呢?笔者介绍两种方式。1. 使用定时器,设置开关private bo...原创 2020-03-10 15:10:04 · 1360 阅读 · 0 评论 -
Android 获取 Notification 权限
本来需要拿一下 Notification 的权限,看了一下网上的博客,基本上都是使用反射,代码较长,而且试了一下,好像拿到的结果也不是很准确,其实可以直接使用 Google 提供的方法:NotificationManagerCompat.from(this).areNotificationsEnabled();一行代码拿到权限,但是需要注意的是,看了源码后发现 4.4 以下是拿不到权...原创 2019-12-09 10:59:15 · 1025 阅读 · 0 评论 -
Android 模块通信—— EventBus
EventBus 是 Android 的一个基于发布/订阅模式的轻量级框架,用于 Android 解耦的事件传递,开源地址。 这是官方地址的一个说明图: 可以看到,它是通过发布者的 post() 来发送时间,订阅者的 onEvent() 来响应事件,我们来看看怎么使用 EventBus: 第一步当然是导入它的依赖库:compile 'org.greenrobot:eventb...原创 2018-07-09 18:06:34 · 2412 阅读 · 1 评论 -
Android 属性动画——插值器、估值器、关键帧
动画中除了一些简单和组合的动画效果,还有很多其它的小功能,比如说这里的插值器、估值器、关键帧。插值器 对 Android 动画来说,不管是视图动画还是属性动画,都是有插值器的,那什么是插值器呢?就是控制动画随着时间轴的变化而变换的效果。 而 Android 动画也自带了一些插值器,如:加速插值器、减速插值器、循环插值器等等,接下来我们看看 Android 动画自带的插值器,我们...原创 2018-07-03 13:59:53 · 1354 阅读 · 0 评论 -
Android 存储——文件存储
Android 数据存储的方式有很多种,其中文件存储就是我们经常会使用的一种方式,在了解文件存储之前,我们先来了解一下我们手机的存储空间。 手机的存储空间可以分为三个部分:系统分区、程序分区、公共存储空间。 系统分区:就是手机操作系统所占用的分区,是内存空间目录下的 system 目录,其中系统自带的 apk 就在 system/app 目录下,需要注意的是,手机普通用户对于 ...原创 2018-07-10 17:08:27 · 442 阅读 · 0 评论 -
Android 通知栏——Notification
在 Android 开发中,通知栏是一个比较常见的功能,我们来看看如何来实现一些简单的通知栏。 实现通知栏主要由两个类:Notification 和 NotificationManager,但是由于 API 版本的不同导致实现方式会有所不同,所以 Google 提供了 v4 包里面的 NotificationCompat 和 NotificationManagerCompat 来实现...原创 2018-07-04 20:34:43 · 3189 阅读 · 0 评论 -
Android 数据储存——SharedPreferences
Android 数据储存的方式有很多种,SharedPreferences 是其中一个较为轻量级的方式,它是将键值对储存在 xml 文件中,获得它的实例有两种方式:// 方式一 SharedPreferences sharedPreferences = PreferenceManager.getDefaultSharedPreferences(this);// 方式二,传入...原创 2018-07-05 16:15:19 · 528 阅读 · 0 评论 -
Program type already present: com.alibaba.android.arouter.routes.ARouter$$Group$$ImBusiness
今天在写东西的时候报了一个错误,这个是使用 alibaba 的路由框架 ARouter,进行模块间通信报才错。 Program type already present: com.alibaba.android.arouter.routes.ARouter$$Group$$ImBusiness 意思是 Arouter 配置的路径的组路径已经存在了,举一个栗子: 我们在中配置模...原创 2018-09-15 14:27:01 · 3046 阅读 · 0 评论 -
Android Studio 上新建了 AIDL 文件,使用不了(找不到)怎么办
进程间通信,我们可以使用 AIDL,但是当我们在 Android Studio 上面新建了 AIDL 文件,却发现 new MyAidl.Stub() 找不到,这个使用要怎么办呢? 编译一下,马上解决!!!...原创 2018-10-11 20:04:40 · 2862 阅读 · 2 评论 -
Android 保存图片(包括网络图片)到单独的相册
我们经常会遇到将图片保存到本地的操作,而且有时候我们需要将图片保存到一个单独的相册,比如微信保存的图片是放到微信相册,微博放到了微博相册。 我们保存的图片可能有很多的类型,比如 Bitmap、网络图片、字节数组、资源 ID 等,根据不同的类型我们需要做不同的处理。我们先看看怎么把 Bitmap 保存到本地相册:public static void saveImageToGall...原创 2019-09-20 17:31:34 · 1206 阅读 · 0 评论 -
Android 动画——属性动画
从 Android 3.0 就推出了属性动画,在以前使用的是视图动画,那么属性动画的优势在哪呢?都知道,视图动画对于一个 View 的操作仅仅只是一个表象的操作,就是说,视图动画中,仅仅只是对它视图的操作,而它真实的坐标和属性并没有发生变化,那么属性动画就是对一个 View 或者非 View 属性的操作,这一强大功能让它解决了视图动画的缺陷。 和视图动画一样的是,属性动画(Anima...原创 2018-07-02 17:56:59 · 4619 阅读 · 0 评论 -
Android 自定义 View——手势密码
Android 自定义 View 当然是十分重要的,笔者这两天写了一个自定义 View 的手势密码,和大家分享分享: 首先,我们来创建一个表示点的类,Point.java:public class Point { // 点的三种状态 public static final int POINT_STATUS_NORMAL = 0; public static ...原创 2018-06-29 15:58:16 · 580 阅读 · 0 评论 -
Fragment 中 commit already called
每一个实例化后的 FragmentTransaction 的事物只能被提交一次,我开始时是定义了一个全局的 FragmentTransaction,然后就只在 onCreate() 方法中实例化了一次,但是我设置点击事件切换 fragment 时,会导致二次 commit,所以会报错。@Override public void onClick(View view) { ...原创 2018-06-17 15:28:28 · 5990 阅读 · 0 评论 -
Failed to load platform rendering library
有时候你创建一个 Android 项目,在 layout 目录下,你设计的 Activity 布局却不能成功显示,上面提示 Failed to load platform rendering library,这对于我们进行页面开发时无疑是一种干扰,我们不能看到当前布局的实时情况,总不可能修改一次都拿去跑一遍,那也太浪费时间了。 其实原因是因为你的 SDK 版本更...原创 2018-05-09 16:27:58 · 7224 阅读 · 2 评论 -
Android 广播(Broadcast Receiver)两种注册方式
广播作为 Android 四大组件之一,其重要性不言而喻,使用广播的时候一般有两种注册方式:动态注册(通过 Java 代码实现广播注册) 新建一个类,继承自 BroadcastReceiver,重写 onReceive() 方法public class ChangeReceiver extends BroadcastReceiver { @Override public ...原创 2018-05-09 20:56:33 · 1029 阅读 · 0 评论 -
Android View 的工作原理(包含对 DecorView 和 ViewRoot 的简单介绍)
什么是 View ? View 是 Android 中所有控件的基类,View 可以是单个控件,也可以是由多个控件组成的一组控件。ViewGroup 里面可以有子 View,子 View 里面也可以有 ViewGroup。什么是 ViewRoot、DecorView ? View 有三大流程,measure、layout、draw,了解并熟悉其三大流程对于我们进行 Androi...原创 2018-05-10 20:14:39 · 1814 阅读 · 0 评论 -
Android View 的事件分发机制
了解并熟悉 View 的事件分发机制对于 Android 开发者来说是一件很重要的事情,一般来说,要分析的事件分发机制的对象就是点击事件(Motion Event)。所谓的事件分发,就是对点击事件的分发过程,当一个点击事件发生后,将点击事件分发到一个具体的 View 上。 那么为什么需要事件的分发机制呢?因为,View 是以一个树的数据结构存在,当你点击屏幕时,触摸点下面可能是几个 ...原创 2018-05-11 22:20:02 · 203 阅读 · 0 评论 -
Android 图片高效加载
由于 Bitmap 的特殊性和 Android 对于每一个应用所施加的内存限制,就会导致加载图片可能会出现 OOM 内存溢出,所有要如何高效加载一个图片是很重要的。 那么在 Android 如何加载一个图片呢?BitmapFactory 类提供了四种方法:decodeFile、decodeResource、decodeStream、decodeByteArray。从它们名字我们就可以...原创 2018-05-12 18:01:32 · 401 阅读 · 0 评论 -
Android 缓存策略
对于一个应用来说,是否被用户接受、喜爱,除了其内容以外,对于流量的消耗也是一个重要原因。比如当一个页面需要展现很多图片,如果图片没有替换或者更新,当用户多次点击进入该界面,难道要一次一次从网络上加载图片吗?那样便会消耗很多流量,对于用户来说必定是一个糟糕的体验。这时候就需要缓存策略了: 当程序第一次运行,当程序从网络上加载图片后,便将它缓存到储存设备上,往往也会把图片缓存到内存中,当...原创 2018-05-13 19:23:42 · 391 阅读 · 0 评论 -
Android 性能优化——布局优化(include 标签、merge 标签和 ViewStub)
一个应用使用起来是否流畅对于用户来说是首要体验感,因为对于非开发者的用户来说,很难理解到 Android 中一个功能实现的难易程度,他们能判断这个应用是否好用的依据可能就是在功能实现上、动画上、流畅度上等。其中流畅度基本上是最重要的,当用户使用一个软件,如果页面加载很慢,或者经常发生 OOM 导致异常退出,那么这个应用一定不会收用户喜爱,所以对于 Android 应用的优化是非常重要的。 ...原创 2018-05-14 22:38:44 · 949 阅读 · 0 评论 -
Android 内存泄漏优化
对于 Android 开发来说,有一个问题是我们必须要重视的:内存泄漏。因为内存泄漏是造成应用程序 OOM 的主要原因之一。对于内存泄漏,我们可以在开发过程中尽量避免,也可以使用 Android Studio 自带的分析工具或者 MAT 来找出潜在的内存泄漏加以解决。 那什么是内存泄漏呢?内存泄漏是指在程序开发中,当一个对象不再需要使用,本该被回收时,却被另一个正在使用的对象持有它的...原创 2018-05-15 21:27:31 · 167 阅读 · 0 评论 -
Android 开发规范(阿里巴巴 Android 开发手册)
笔者是一名学生,其实对于学生和准备踏入这行领域的小伙伴来说,对于从事 Android 开发,有一个好的开发规范,能够更加高效的进行合作开发,也能在别人接受自己的任务和自己接手别人的任务时花费更少的时间,让代码的可读性更高,所以,对于一个开发者来说,规范的编写自己的代码特别重要。笔者是一名 Android 的学者,所以这里推荐 Android 的开发规范,就是阿里巴巴 Android 开发手...原创 2018-06-13 20:40:37 · 1018 阅读 · 0 评论 -
Java 使用 Socket、RxJava、Gson 传输解析 json
项目源码地址:地址 这几天和做嵌入式的学长做了一个小项目,学长使用 Socket 来传输包含了各个传感器信息和摄像头图片的 json 字符串,我这边使用 Android 客户端显示和加载信息和图片。 这里使用的 Base64 编码来对图片进行编码,每一张图片都比较大,我们想实现高频率传输图片做成视频的效果。使用 GsonFormat 创建 Bean 类: 先导入 Gson...原创 2018-05-31 18:46:38 · 1382 阅读 · 2 评论 -
Android 动画——视图动画(补间动画+帧动画)
Android 动画主要可以分为两种,一种就是视图动画,一种就是属性动画,这里我们先了解一下视图动画。而视图动画也分为 Tween(补间)动画和 Frame(帧)动画。补间动画 补间动画就是一个 View 从开始状态到结束状态变化的过程,补间动画有四种基本变化:渐变、平移、缩放、旋转,这四种基本动画效果都可以通过 xml 和代码两种方式来实现。补间动画如果要使用 xml 方法,就需要...原创 2018-06-29 11:02:15 · 516 阅读 · 0 评论 -
Android Fragment 使用
Fragment 是 android 中比 Activity 更加轻量级的视图与逻辑结合的碎片, 我们可以在应用中使用,更方便的达到一些业务需求。 使用 Fragment,我们要创建一个类继承自 Fragment,一般我们选择继承 v4 包下面的 Fragment,兼容更好: public class TestFragment extends Fragment { priv...原创 2018-06-29 11:59:44 · 268 阅读 · 0 评论 -
关于 Android 中导入依赖库的注意事项
Android 开发中,不可避免的要使用一些 sdk 自带的或者优秀开发者的一些依赖库,但是,导入依赖库时也会发生一些问题Failed to resolve:com.android.support:appcompat-v7:xx.xx.xx support 依赖库是 Android 开发中为了一些功能能够被一些老版本使用所开发的依赖库,但是有时候改变依赖库版本或者新安装 Android ...原创 2018-05-08 21:29:15 · 659 阅读 · 0 评论