自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(25)
  • 收藏
  • 关注

原创 Flutter 混合开发(Android)Flutter跟Native相互通信

前言Flutter 作为混合开发,跟native端做一些交互在所难免,比如说调用原生系统传感器、原生端的网络框架进行数据请求就会用到 Flutter 调用android 及android 原生调用 Flutter的方法,这里就涉及到Platform Channels(平台通道)Platform Channels (平台通道)Flutter 通过Channel 与客户端之间传递消息,如图:image.png图中就是通过MethodChannel的方式实现Flutter 与客户端之间的消

2020-06-19 21:27:57 600

原创 Android开发之dagger.android--Activity

Dagger2开发Android的问题使用Dagger2开发Android的话,有一个困难就是android的一些框架类,如Activity和Fragment等,他们的实例化由操作系统完成,如果要想让Dagger2也能很好地注入这些对象,你不得不在生命周期里添加以下代码完成注入过程。public class FrombulationActivity extends Activity { @Inject Frombulator frombulator; @Override public

2020-06-11 20:03:28 221

原创 把Android源码导入Android Studio进行调试

现在很多公司已经抛弃了单纯App开发的模式,慢慢的走向了源码编译;通过修改Framework层的东西,达到自己想要的需求,但是问题也来了,我们不能像往常一样,通过import/open来编辑编译它;正如刚开始的我,一直在用Sublime来编辑,make命令来编译,手动导包,手动查找Api,那简直是噩梦!如题,直接进入正文!说一下我用的环境:Ubuntu14.04、openjdk1.7、Android Studio2.2、Android6.0源码这里先不说如何下载源码,直接从编译开始$ s

2020-06-10 19:34:42 581

原创 Shadow解决Activity等组件生命周期的方法解析

明确问题每个Android插件框架要解决的首要问题都是Activity的生命周期问题。Activity代表了Service等其他需要注册的组件。不同是插件框架解决这个问题的前提也不完全一样。而我们的业务要求比较苛刻,再加上Android 9.0的非公开API限制,所以由这些前提要求:插件代码也要能正常编译安装运行。 插件代码都是现有业务代码,不能因为接入插件框架而需要修改代码(即需要插件框架无代码侵入性)。 在宿主的AndroidManifest.xml中只能注册有限数量(大约10个)的组件。宿

2020-06-09 17:00:34 404

原创 Ashmem(Android共享内存)使用方法和原理

简介Ashmem即Android Shared Memory, 是Android提供的一种内存共享的机制。使用Java层借助MemoryFile或者SharedMemory。 Native层借助MemoryHeapBase或者MemoryBase。 Native层直接调用libc的ashmem_create_region和mmap系统调用。MemoryFile基于SharedMemory。MemoryBase基于MemoryHeapBase。SharedMemory、MemoryHe..

2020-06-08 15:09:11 1236

原创 Flutter Android 端热修复(热更新)实践

在本次 文章中,简单分析了一下 Flutter 在 Android 端的启动流程,虽然没有更深入的分析,但是我们可以了解到,对于 Flutter 端的 Dart VM 的启动等,是通过 Android 传递的资源(或者说路径)过去,Dart VM 加载这些资源完成初始化的,那么我们可以通过动态替换资源就可以达到热更新的目的。注意:不同版本的 Flutter 代码与逻辑可能有所不同,但整体流程大同小异。 同样的,不同版本 Flutter 编译之后的产物不同, Release 模式 和 Debug

2020-06-06 21:15:42 2960 1

原创 Android开发之dagger.android--Fragment

注入Fragment实例注入Fragment和注入Activity是一样的,以相同的方式定义subcomponent,不同有以下几点是不同的。1 使用Fragment参数来代替Activity参数 2 使用 @FragmentKey来代替@ActivityKey 3 使用HasFragmentInjector来代替@HasActivityInjector 4 AndroidInjection.inject(Fragment)方法,在Fragment的onAttach()中调用,而不是在onCr

2020-06-05 21:32:59 410

原创 Android中的android:layout_width和android:width的区别

在android系统中,我们可以通过在xml资源文件中定义布局,一般的写法是:<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="match_parent"android:background="#ffffffff"android:orientation="vertical" &gt

2020-06-05 17:30:20 825

原创 [-Flutter 自组篇-] 圆形进度条

今天写个简单的,自定义一个圆形进度条,并且加上小箭头指向内圈进度。进度条已上传到公网,使用circle_progress: ^0.0.1,使用如下void main() => runApp(MaterialApp( title: 'Flutter Demo', theme: ThemeData( primarySwatch: Colors.blue, ), home: Scaffold( appBar: AppBar...

2020-06-04 13:32:17 741

原创 打包Framework,使用bundle,Framework联调

文章主要介绍怎么打包静态库(这里只说Framework),打包bundle,Framework联调,以及项目中遇到的一些关于Framework,bundle的问题。什么是静态库,估计很多人不会怎么关心,很多也能说出个大概。这里三两句就过了。静态库 以”.a”或者“.framework”为文件后缀名 静态库链接时会被完整的复制到可执行文件中,被多次使用就有多份拷贝。 动态库 以”.dylib”或者“.framework”为文件后缀名 动态库链接时不复制,程序运行时由系统动态加载到内存,供程序

2020-06-03 20:22:11 898

原创 Android热修复Tinker原理分析

目录1、tinker的class文件修复2、tinker的资源文件修复3、几种热修复方案对比1、tinker的class文件修复1.1、先说dex文件的加载和类的查找过程1.1.1、dex文件的加载过程Java层通过我们会通过创建一个DexClassLoader来加载我们的dex,下面就以此为切入点进行dexClassLoader = new DexClassLoader(apkPath, getFilesDir().getAbsolutePath(), null, getCl

2020-06-02 19:41:01 895

原创 Kotlin - 正确使用Kotlin注解,兼容Java代码

正确使用Kotlin注解,兼容Java代码大多数情况下,你不需要关注这个问题。但是,如果你的代码中包含了部分Java代码,理解这些注解将帮助你解决很多棘手问题。产生这个问题的根本原因在于:Kotlin语言与Java语言的设计思路不同,部分特性属于Java语言独有,例如静态变量。部分特性属于Kotlin语言独有,例如逆变和协变。为了抹平这些差异,Kotlin语言提供了一个绝佳的思路,通过添加注解可以改变Kotlin编译器生成的Java字节码,使之按照Java语言可以理解的方向进行,从而实现兼

2020-06-01 17:01:36 507

原创 NuWa热修复原理基础详细解说——初识,热修复

一、什么是热修复: 相信很多人第一次听说热修复的时候也是一脸茫然,那么我就用自己的话来跟大家讲解一下。当一个已经上线的APP突然发现一个严重的bug的时候,除了重新发版,让用户重新下载覆盖安装以外,还有没有别的方法来解决呢?如果可以有一个动态修复的方法就好了,那就是热补丁动态修复技术,也就是我们说的热修复。向用户下发Patch,在用户无感知的情况下,修复bug问题。这里用到的是android dex分包方案,后面会具体解释如何实现的。这里我们先说一下Android的插件化,Android插件化分

2020-05-30 21:22:56 1160

原创 【Android源码分析】Android系统关键服务启动简析

一、关于Android系统重要的进程(1)、init进程:init进程是Linux内核启动完成之后,启动的第一个用户进程,Android系统就是在这个进程的基础上启动起来的,进程pid为1。init进程通过解析init.rc来陆续启动其他关键的系统服务进程---其中最重要的是:ServiceManager,Zygote和SystemServer。(2)、ServiceManager:主要负责添加服务,获取服务,查找服务以及当某个服务意外终止时,对该服务的资源进行回收。(3)、Zygote进程:

2020-05-29 21:37:42 1147

原创 Android 自定义 View 实现横行时间轴

本篇文章会说下如何使用并且要用麻烦的自定义 view 去实现时间轴效果,以及如何分析、实现自定义 view。 需要具备的知识:Paint、Canvas、自定义 view 的绘制流程。一、已经有很多 RecycleView 实现时间轴的例子,为何还要费劲的使用自定义 view 去实现时间轴?首先看下最终想要的效果:根据上图可以总结出以下几点:每个阶段要显示时间、阶段名、状态图标、中间有虚线; 文字上下交错显示; 相邻阶段的文字在垂直方向上是可以相交的; 时间轴的个数不确定,但是要铺满

2020-05-28 13:57:33 651

原创 Android 快速定位耗时方法

一、启动耗时检测1、查看Logcat在Android Studio Logcat中过滤关键字“Displayed”,可以看到对应的Activity启动耗时日志。2、adb shell使用adb shell获取应用的启动时间adb shell am start -W [packageName]/[AppstartActivity全路径]执行后会得到三个时间:ThisTime、TotalTime和WaitTime,详情如下:ThisTime最后一个Activity启动耗时。To.

2020-05-27 18:12:20 1378

原创 Android Studio 3.0中解决apt报错,android-apt切换为官方annotationProcessor

Android Studio 3.0中解决apt报错,android-apt切换为官方annotationProcessor最近从GitHub上Fork了一个项目,用Android Studio3 打开后报错Error:Cannot choose between the following configurations of project :EasyAdapterLibrary: - debugApiElements - debugRuntimeElements - releas

2020-05-23 22:09:21 471

原创 Android系列:彻底了解Handler

一、Handler1.1 Android为什么==非ui线程==不能==更新ui==UI线程的机制 为什么UI不设计成线程安全 非ui线程一定不能更新ui吗1.1.1 ui线程机制 public static void main(String[] args) { Looper.prepareMainLooper(); ActivityThread thread = new ActivityThread(); thread.attac

2020-05-22 20:32:05 268

原创 SystemUI之通知图标控制

本文是基于Android 10源码分析的。SystemUI之状态图标控制分析了状态栏上状态图标(例如 wifi, bt)的控制流程,比较简单。本文来分析下状态栏上通知图标的控制流程,主要分析当一个新通知来临时,新通知的图标是如何一步步显示到状态上的。通知图标控制器从SystemUI之状态图标控制可知,状态图标是由一个叫StatusBarIconController接口控制显示的,而通知图标区域也有一个控制器,叫NotificationIconAreaController(它不是一个接口)。.

2020-05-21 17:03:39 614

原创 Android线程池设计原理

进程:每个app运行时前首先创建一个进程,该进程是由Zygote fork出来的,用于承载App上运行的各种Activity/Service等组件。进程对于上层应用来说是完全透明的,这也是google有意为之,让App程序都是运行在Android Runtime。大多数情况一个App就运行在一个进程中,除非在AndroidManifest.xml中配置Android:process属性,或通过native代码fork进程。线程:线程对应用来说非常常见,比如每次new Thread().star

2020-05-20 14:52:57 472

原创 Android Studio 学习之 Debug 调试

前言正所谓,工欲善其事必先利其器,对于一个程序员来说,IDE就是我们器啊。IDE掌控的越熟悉,工作效率就越高(划水摸鱼的时间更多),所以要想效果更高(摸更多的鱼),就要好好学习如何使用IDE。作为一个Android开发是无疑是幸福的,背靠Google爸爸,加上JetBrain的加持(JB大法好),所以就有了最完美的(不接受反驳)IDE—Android Studio(下文都以AS简称),就是有点吃内存哈????,当然在16G内存的MBP上这些都不是事。虽然做了3年的Android开发,对于AS一直都是

2020-05-19 19:51:10 669

原创 扫盲细节,Android 的事件分发机制

事件都是从用户按下(ACTION_DOWN)的那一刻产生的,三个非常重要的与事件相关的方法:dispatchTouchEvent() onTouchEvent() onInterceptTouchEvent()Activity 的事件分发机制从单词含义已经很明显的知道,dispatchTouchEvent()是负责事件分发的。当点击事件产生后,事件首先会传递给当前的 Activity,这会调用 Activity 的dispatchTouchEvent()方法,看看源码中是怎么处理的。...

2020-05-18 17:46:14 120

原创 你不知道Android四大组件秘密

Android四大组件用了很多遍了,但还是有很多细节容易忘记,所以就写下来吧!ActivityActivity的生命周期在这里插入图片描述Activity的简单生命周期流程为onCreate();→onStart();【注:此时Activity处于不可见状态】→onResume();【注:此时Activity处于运行状态】→onPause();【注:此时Activity处于暂停状态】→onStop();【注:此时Activity处于停滞状态】→onDestroy();【注:调用了此.

2020-05-15 14:59:29 106

原创 Android基础 : Android ContentProvider和getContentResolver

最近头有点大我们说点基础吧,今天心情不错.那就直入主题ContentProvider因为在Android系统里面,数据库是私有的。一般情况下外部应用程序是没有权限读取其他应用程序的数据。如果你想公开你自己的数据,你有两个选择:你可以创建你自己的内容提供器(一个ContentProvider子类)或者你可以给已有的提供器添加数据-如果存在一个控制同样类型数据的内容提供器且你拥有写的权限。而外界根本看不到,也不用看到这个应用暴露的数据在应用当中是如何存储的,或者是用数据库存储还是用文件存储,还是通过网上

2020-05-14 21:25:39 299

原创 半行代码绑定协程与activity的生命周期

半行代码绑定协程生命周期纯属娱乐!废话不多说,直接上代码!GlobalScope.launch(Dispatchers.IO){}.lifeRecycle(lifecycle) <<<<在这里没错就是这么简单。就是半行代码!先说一下原理在AndroidX中Activity的生命周期的监听可以使用lifecycle。lifecycle.addObserver(LifecycleObserver)使用这个观察者监听当前activity的生命周期

2020-05-13 20:48:14 254

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除