独立进程通信之悬浮下拉状态栏实践

前言

我们首先先看下这个效果是怎么样的,如果有人见过百度音箱或者是小米音箱,就应该对这个会清楚一些,也就是图示中我们是自定义了一个下拉状态栏,并没有使用系统原生的,那么我们就可以根据需求实现我们自定义的下拉状态栏 UI,比如音乐通知,时间、天气显示信息等等。不过这种需要自定义的情况一般是针对于 Android 定制化的地方会用到的多一些,但本文更多的是牵扯的是如何将这个下拉状态栏运行在独立进程中,以及进程之间的通信,这样的话即使下拉状态栏崩溃了,也不会影响主进程。

Android 事件分发的冲突解决方案

阅读本文前,需要对事件分发机制所有了解,建议先阅读 Android 事件分发机制源码流程分析,但是解决这个问题之前,首先我们要知道,滑动冲突是怎么来的,为什么会存在滑动冲突呢 ?

其实在 Android 中,只要是在界面中内外两层 View 可以同时滑动的时候,这个时候,就会产生滑动冲突了,或者可以理解在同一方向一个 View 上只能响应一组事件序列。当然了,部分情况下,会看到同时滑动的情况,可能是通过特殊的方式,将自己的事件序列传递给其他 View 上面了。

Android 协程编写高效的并发程序

协程是什么

Android 官方文档中的描述是:协程是一种并发设计模式,可以在 Android 平台上使用它来简化异步执行的代码。或者通俗的讲:协程就是一套轻量级线程框架,使用方便,拥有一系列的语法糖

使用

Android 中如果要使用协程,必须添加如下依赖库:

1
2
3
dependencies {
    implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.3.9'
}

如何开启一个协程,最简单的方式就是使用 GlobalScope.launch 函数,如下所示:

1
2
3
4
5
fun main() {
    GlobalScope.launch {
        println("hello world-top-level-coroutine")
    }
}

理解 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);