理解 Android 中的 window 与悬浮窗的实现

Window 是什么

  • Window 是一个相对概念上的载体,他并不是一个真正的容器,仅仅负责管理依赖 window 上面的 View 的一个类,充当管理者。
  • Window 是一个抽象类,在源码实现中,只有一个具体的实现类,phoneWindow
  • 创建 Window 需要通过 WindowManager 创建
  • WindowManager 是外界访问 Window 的入口
  • Window 具体实现位于 WindowManagerService 中
  • WindowManager 和 WindowManagerService 的交互是通过 IPC 完成

Activity 和 Window 之间的关系

解决日志打印 Unicode 编码问题

最近接入了一个第三方的网络接口,他们的日志都被 Unicode 编码了,全都是这样很多反斜杠类似的:

1
\u7136\u540e\u70b9\u51fb\u8981\u8f6c\u6362\u7684\u7c7b\u578b\u6309\u94ae\uff0c\u8f6c\u6362\u5b8c\u6210\u540e\u5373\u53ef\u770b\u5230\u5bf9\u5e94\u7684\u5185\u5bb9\u3002

华为 Android 10.0 启动服务失败

最近调研了一个音乐服务的 App 以及相关功能的库。发现使用的时候,开启了一个音乐服务,在其他的手机上面暂时没有发现其他什么问题,但是在华为 Android 10 手机上每次 run 的时候,服务正常启动也是没有问题的, 但是如果关闭掉 App ,重新启动 App 服务就起不来了。我尝试如下两种方式启动服务:

1
2
bindService(Service, mConnection, Context.BIND_AUTO_CREATE)
startService(Service);

Android 转场动画之揭露动画的使用

配置 Activity 的转场动画

使用揭露动画,主要是使用到了 ViewAnimationUtils.createCircularReveal() 这个 API ,官方已经给我们封装好了,我们具体看下各个参数是什么意思,就知道如何使用了

1
2
3
4
 public static Animator createCircularReveal(View view,
            int centerX,  int centerY, float startRadius, float endRadius) {
        return new RevealAnimator(view, centerX, centerY, startRadius, endRadius);
 }

Hugo 博客使用 utterances 作为评论系统

utterances 是一款基于 GitHub issues 的评论工具

相比同类的工具 gitment、gitalk 以及 disqus 评论工具,优点如下:

  1. 极其轻量
  2. 加载非常快
  3. 配置比较简单
  4. disqus 这个工具配置也比较简单,也是免费的。但是,广告多,而且加载也比较慢。
  5. utterances 是基于 github issue ,拥有多种主题的开源免费小组件。

Kotlin 中的高阶函数

定义

如果一个函数接受另外一个函数作为参数,或者返回值的类型是另外一个函数,那么该函数称为高阶函数

函数类型的定义如下

1
(String, Int) -> Unit 

Kotlin 中的密封类

密封类

密封类用来表示受限的类继承结构:当一个值为有限几种的类型, 而不能有任何其他类型时。在某种意义上,他们是枚举类的扩展:枚举类型的值集合 也是受限的,但每个枚举常量只存在一个实例,而密封类 的一个子类可以有可包含状态的多个实例。

kotlin 中的运算符重载

简介

运算符重载是 Kotlin 中的提供的一个比较有趣的语法糖,我们知道,在 Java 中有许多语言内置的运算符关键字,比如 + - * / % ++ – 。而 Kotlin 中允许我们将这些所有的运算符甚至其他的关键字进行重载

Android 中的进程间通信简单使用

Binder 是什么

首先在 Android 中, Binder 是一个类,实现了 IBinder 接口, 是实现跨进程通信 (IPC)的一种方式

为什么需要跨进程通信

因为在 Android 中一个应用相当于一个进程,而一个进程中有一个独立的用户空间,而用户空间都是独立的,进程之间是隔离的。也就是说,两个进程之间不可进行直接的通信,需要通过一个桥梁,这个就是 Binder