Android

A collection of 16 posts

Android Jetpack - LiveData
Android

Android Jetpack - LiveData

LiveData 概述LiveData 是一个可观察数据包装类,与普通观察者不同,LiveData 具备生命周期感知能力,这意味着它遵循其它应用组件的生命周期(Activity、Fragment、Service 等),此感知能力确保了 LiveData 只更新处于生命周期活跃状态的组件的观察者 生命周期活跃状态的定义是这些组件正处于 STARTED 或 RESUMED 状态,LiveData 只会更新活跃状态的观察者,而已注册但处于非活跃状态的观察者不会被更新 我们可以在实现了 LifecycleOwnerJetpack的接口的对象中注册 observer,这种关联允许 observer 在与之相关的 Lifecycle 对象处于

  • skyrin
    skyrin
Android Jetpack - Lifecycles
Android

Android Jetpack - Lifecycles

Lifecycles 简介Lifecycles 即生命周期,属于 Jetpack 架构组件之一的 Lifecycles 组件是可以为其它组件提供生命周期感知能力的一个组件,而具备了生命周期感知能力的组件就叫生命周期感知组件,注意加粗部分多读两遍,我看网上很多文章直接把 Lifecycles 组件叫生命周期感知组件😂 那么什么是生命周期感知能力呢?我们知道四大基础组件有生命周期,能感知这些生命周期的组件就具备了生命周期感知能力,所以我认为以前我们使用的 MVP 模式中的 Presenter 如果它通过接口等方式间接获得了 Activity 的生命周期,它也算是一个生命周期感知组件,但是这种获取生命周期的方式和 Lifecycles 比起来还是太 low 了,我们接着对比传统生命周期感知方式,

  • skyrin
    skyrin
Android Jetpack - ViewModel
Android

Android Jetpack - ViewModel

ViewModel 简述ViewModel 旨在以生命周期感知的形式存储和管理 UI 控制器(Activity/Fragment 等)相关的数据,可以解决 UI 控制器中数据无法正确保留以及数据在其复杂的生命周期中难以维护的痛点,它的生命周期感知能力需要配合 Lifecycles 组件才能实现,本文聚焦于 ViewModel 所以先不讲 Lifecycles ,关于 Lifecycles 我会在其它文章详细介绍 为什么使用 ViewModel ?我觉得这个问题很重要,当我们使用任何一个新工具的时候都需要弄清楚这个问题,要结合实际情况而非盲目跟随,接下来我会逐一尝试说明 ViewModel 对比传统方案的优劣

  • skyrin
    skyrin
Android Jetpack - DataBinding
Android

Android Jetpack - DataBinding

什么是 DataBinding ?DataBinding 是属于 Jetpack 的一个支持库,可以让你以在布局中声明属性的方式替代编码方式将布局中的 UI 组件和应用数据进行绑定 通常我们让控件和数据交互的方式如下面的代码,调用 findViewById() 获取 TextView 控件并将 viewModel 中的 userName 属性赋值给它: findViewById<TextView>(R.id.textView).apply { text = viewModel.userName

  • skyrin
    skyrin
Android Jetpack - Room
Android

Android Jetpack - Room

Room 简介Room 持久化库提供了一个基于 SQLite 的抽象层,以便在利用 SQLite 的全部功能的同时实现更强大的数据库访问 Room 库帮你的 App 在设备上创建一个缓存,并作为此 App 的单一事实来源,允许用户在应用内查看关键信息的一致副本,无论用户是否具有互联网连接 处理重要数量的结构化数据的应用程序可以从本地保存数据中受益匪浅。最常见的用例是缓存相关的数据。这样,当设备无法访问网络时,用户仍然可以在离线时浏览该内容。然后,在设备重新联机后,任何用户启动的内容更改都会同步到服务器 Room 的三个主要部分包括 Database 包含数据库持有者,并作为应用程序的持久关系数据的基础连接的主要访问点。

  • skyrin
    skyrin
工具

快速发布 Android/Java Libs 到 Bintray 以及 Jcenter

本文内容为:如何使用 BintrayRelease 插件快速发布一个 Android/Java Lib 到 Bintray Mavne,并引入 Project 使用的流程。 创建 Bintray 账户及 Maven 仓库1、打开 Bintray 首页,点击 For an Open Source Account Sign Up Here,快速注册或者用第三方的账户登陆即可 2、个人页面点击 Add New Repository 创建一个 Mavne 仓库 填写仓库信息,仓库名称记住,后面有用 3、获取

  • skyrin
    skyrin
Android

Android 5.x 免 Root 升级系统 WebView

前言Android 的系统碎片化问题可以说是 Android 系统最大的硬伤了,自这个系统诞生以来十几年过去了,依然没能很好的解决,碎片化问题也是每个 Android 开发工程师心中的隐痛😂,每次处理系统碎片化带来的问题时,血压也能分分钟飙升到 200+,为了减轻其他同仁的痛苦以及此后再遇到类似问题能少踩几个坑,就之前的爬坑经历做个记录吧。 1、WebView有关 WebieView 的重要性和其使用不是本文的重点,但是有几个相关的属性我们必须了解: WebView 迭代历史在Android4.4(API level 19)系统以前,Android使用了原生自带的Android Webkit内核,这个内核对HTML5的支持不是很好,现在使用4.4以下机子的也不多了,就不对这个内核做过多介绍了,有兴趣可以看下这篇文章。 从Android4.4系统开始,Chromium内核取代了Webkit内核,正式地接管了WebView的渲染工作。Chromium是一个开源的浏览器内核项目,基于Chromium开源项目修改实现的浏览器非常多,包括最著名的Chrome浏览器,以及一众国内浏览器(360浏览器、QQ浏览器等)。其中Chromium在Android上面的实现是Android

  • skyrin
    skyrin
Android

Android 自定义 View - AreaSelectLayout

前几天写了一个小工具,其中一个设置项需要屏幕区域范围坐标参数,由于通过观察直接填写坐标信息不太现实,于是就有了通过直接拖拽屏幕去取这个参数的需求,又因为需要在任意界面都能选取,所以就想到了悬浮窗,这里以前写过一个悬浮窗工具类《FloatWindowUtils 实现及事件冲突解决详解》,想着再加一些手势及绘制应该就能实现,于是吭叽吭叽搞了半天,发现其中还是有些坑的,所以在此记录备忘。 效果图和用法如下: 如上图,这个 View 的功能很简单,就是在屏幕上弹出一个全屏悬浮窗遮罩,然后在上面拖拽选择区域,最后保存坐标信息就好了。 详细实现我就不讲了,后面会贴源码,这里主要讲一下实现思路和几个需要注意的点 实现思路继承 View 还是 ViewGroup由于悬浮窗里需要有提示文字以及取消和保存两个按钮,所以我没有直接去继承 View 来写,直接继承 View 来实现当然也可以,但是需要把下面的文字以及按钮都画出来,可能还需要内置按钮的触发回调等等业务,最终我选择了继承 ViewGroup(ConstrainsLayout) 来实现,这样做可以共享 ConstrainsLayout 的所有属性。和直接继承

  • skyrin
    skyrin
Android

Android 架构 - MVVM 介绍

概述 只要你掌握了基础知识,要想构建一个完整的 Android App 并不难,但是想要写出一个可维护的 App 就是另一回事了,这时候就必须让你自己的代码足够健壮,就需要避免把所有业务逻辑代码都放在 Activity、Fragment,或者是创建多个比较小的只有单一功能的 class。 那么应该怎么做呢?—— 使用 **架构模式!**MVC、MVP、MVVM、...任何一种都要比没有架构设计的流水式代码好得多,MVVM 是 Android 开发最好的架构选择之一。Google 官方也非常支持和鼓励开发者使用这一架构模式。 本教程将为你讲明白到底什么是 MVVM,虽然我也不喜欢理论,但有时候在实际操作之前先了解它非常重要,所以请务必耐心看完。 Model-View-ViewModel 的意义关注点分离原则是架构的终极原则,并且每个设计模式都在尽其所能的实现这一点。在 MVVM 中,有 3 个固定部分有助于实现关注点分离:models,views

  • skyrin
    skyrin
Android

Android CPU ABI

ABI 简述不同 Android 设备使用不同的 CPU,因此支持不同的指令集。CPU 与指令集的每种组合都有其自己的应用二进制界面(或 ABI)。 ABI 可以非常精确地定义应用的机器代码在运行时如何与系统交互。 您必须为应用要使用的每个 CPU 架构指定 ABI。 典型的 ABI 包含以下信息: 机器代码应使用的 CPU 指令集。运行时内存存储和加载的字节顺序。可执行二进制文件(例如程序和共享库)的格式,以及它们支持的内容类型。用于解析内容与系统之间数据的各种约定。这些约定包括对齐限制,以及系统如何使用堆栈和在调用函数时注册。运行时可用于机器代码的函数符号列表 - 通常来自非常具体的库集。目前几种 Android CPU ABICPU 架构描述armeabi第5代 ARM v5TE,使用软件浮点运算,兼容所有ARM设备,通用性强,速度慢armeabi-v7a第7代

  • skyrin
    skyrin
Android

Android 7.0 FileUriExposedException 的处理

发现问题前几天把手机系统升级到基于 Android 7.0,后来在升级调试一个应用时抛出如下异常信息: android.os.FileUriExposedException: file:///storage/emulated/0/Android/data/com.skyrin.bingo/cache/app/app.apk exposed beyond app through Intent.getData() at android.os.StrictMode.onFileUriExposed(StrictMode.java:1799) ... at com.skyrin.bingo.update.AppUpdate.installApk(AppUpdate.java:

  • skyrin
    skyrin
Android

Android 中的进程和线程

当某个应用组件启动且该应用没有运行其他任何组件时,Android 系统会使用单个执行线程为应用启动新的 Linux 进程。默认情况下,同一应用的所有组件在相同的进程和线程(称为“主”线程)中运行。 如果某个应用组件启动且该应用已存在进程(因为存在该应用的其他组件),则该组件会在此进程内启动并使用相同的执行线程。 但是,您可以安排应用中的其他组件在单独的进程中运行,并为任何进程创建额外的线程。 本文档介绍进程和线程在 Android 应用中的工作方式。 进程默认情况下,同一应用的所有组件均在相同的进程中运行,且大多数应用都不会改变这一点。 但是,如果您发现需要控制某个组件所属的进程,则可在清单文件中执行此操作。 各类组件元素的清单文件条目—、、 和 —均支持 android:process 属性,此属性可以指定该组件应在哪个进程运行。您可以设置此属性,使每个组件均在各自的进程中运行,或者使一些组件共享一个进程,而其他组件则不共享。 此外,您还可以设置 android:process,使不同应用的组件在相同的进程中运行,但前提是这些应用共享相同的 Linux

  • skyrin
    skyrin