姚陆浩的博客

用文字构建一个理想的世界


  • 首页

  • 标签

  • 分类

  • 归档

  • 关于

  • 日程表

  • 搜索

从源码的角度描述 Activity 的启动模式

发表于 2018-05-06 | 分类于 Android , Activity | | 阅读次数:

Activity 显示调用

Android 系统内部已经做了很多的封装,这使得启动一个 Activity 变得异常简单。在显示调用的情况下,只需要通过如下代码即可完成:

1
2
Intent intent = new Intent(this, TestActivity.class);
startActivity(intent);

源码分析

我的源码是基于 Android 8.0 进行源码分析,那么我们就从 Activity 的 startActivity 方法开始分析,经过一系列的源码追踪会来到 startActivityForResult 方法,代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
public void startActivityForResult(@RequiresPermission Intent intent, int requestCode, @Nullable Bundle options) {
if (mParent == null) {
options = transferSpringboardActivityOptions(options);
Instrumentation.ActivityResult ar = mInstrumentation.execStartActivity(this, mMainThread.getApplicationThread(), mToken, this, intent, requestCode, options);
if (ar != null) {
mMainThread.sendActivityResult(mToken, mEmbeddedID, requestCode, ar.getResultCode(), ar.getResultData());
}
if (requestCode >= 0) {
// If this start is requesting a result, we can avoid making
// the activity visible until the result is received. Setting
// this code during onCreate(Bundle savedInstanceState) or onResume() will keep the
// activity hidden during this time, to avoid flickering.
// This can only be done when a result is requested because
// that guarantees we will get information back when the
// activity is finished, no matter what happens to it.
mStartedActivity = true;
}
cancelInputsAndStartExitTransition(options);
// TODO Consider clearing/flushing other event sources and events for child windows.
} else {
if (options != null) {
mParent.startActivityFromChild(this, intent, requestCode, options);
} else {
// Note we want to go through this method for compatibility with
// existing applications that may have overridden it.
mParent.startActivityFromChild(this, intent, requestCode);
}
}
}
阅读全文 »

OkHttp 和 Retrofit

发表于 2018-03-23 | 分类于 Android , 网络 | | 阅读次数:

OkHttp 和 Retrofit 两大框架的作用和联系

OkHttp

OkHttp 是一款为 Java 项目和 Android 应用设计的 HTTP 与 HTTP/2 的客户端。

HTTP 是现代应用网络比较流行的传输协议,是我们所交换数据的媒介。高效的 HTTP 使得你加载的数据更快以及节省带宽。

OkHttp 是一个默认高效的 HTTP 客户端:

  • HTTP/2 支持允许同一主机的所有请求共享一个 socket。
  • 连接池减少请求等待时间(如果 HTTP/2 未被占用)。
  • 下载 GZIP 减少了下载大小。
  • 响应缓存完整避免了重复请求网络。

当网络异常时,OkHttp 依然会工作:它会默默地从常见的连接问题中恢复过来。如果你的服务有多个 IP 地址,OkHttp 会尝试在第一次连接失败的时候更换 IP 地址。这对IPv4 + IPv6和冗余数据中心托管的服务是必需的。OkHttp发起与现代TLS功能(SNI,ALPN)的新连接,并且如果握手失败则回退到TLS 1.0。

阅读全文 »

Android 中的 Binder

发表于 2018-03-17 | 分类于 Android , Binder | | 阅读次数:

什么是Binder?

作为远程对象的基类,通过 IBinder 被定义为一个轻量级远程过程调用机制(RPC)的核心部分。这个类一个是 IBinder 的实现类,提供了这种对象的标准的本地实现。

绝大部分开发者不是直接实现这个类,而是为了描述所需接口使用 aidl 工具,使用它生成合适的 Binder 子类。然而你也可以继承 Binder 类实现自定义 RPC,或者作为能够在进程间共享的媒介使用简单实例化的原生 Binder 对象。

这个类只是一个原始 IPC 的基础;它没有影响一个应用的生命周期,只要进程在运行时创建了 Binder,它就有效。为了正确的使用它,你必须在高级的让系统知道你的进程应该保持运行的应该组件(Service,Activity 或 ContentProvider)的上下文中工作。

你必须关注你的进程可能消失的情况,这种情况下,需要你在进程再次开始的时候,重新创建和连接 Binder。例如:如果你在一个 Activity 中使用 Binder,在 Activity 没有显示的时候,你的 Activity 进程可能随时被杀死;如果Activity是之后重新创建的,你需要创建一个新的 Binder,并且把它放回所在的位置;你需要注意,你的进程可能是通过其他原因(比如接受广播)启动,这种情况下,需要重新创建Activity,并且新建一个新的 Binder 对象。

阅读全文 »

Android中的ClassLoader

发表于 2018-03-14 | 分类于 Java , classloader | | 阅读次数:

Android中有哪几种ClassLoader?它们的作用和区别是什么?

Android 中的 ClassLoader 工作交给了 BaseDexClassLoader 来处理。

BaseDexClassLoader 及其子类

ClassLoader 是个抽象类,其直接子类有 BaseDexClassLoader 和 SecureClassLoader。

SecureClassLoader 的子类是 URLClassLoader,其只能用来加载 jar 文件,这在 Android 的 Dalvik/ART 上没法使用的。

BaseDexClassLoader 的子类是 PathClassLoader,DexClassLoader 和 InMemoryDexClassLoader。

阅读全文 »

工作中使用的技巧收录

发表于 2018-01-31 | 分类于 解决方案 | | 阅读次数:

前言

在实际工作中,往往会用到一些工具或者是命令,然而过一段时间可能会忘掉,需要再次查找,反复这样去做会浪费很多时间,因此本篇文章的目的就是将这些工具或命令收集在一起,为的就是节省宝贵的时间,过更美好的生活。

注:本篇文章主要目的在于收集工具和命令集,对于原理性的知识不会过多涉及。文章会持续更新,更新方式是在现有文章的基础上继续添加。

如果能给读者些许帮助,此乃吾之荣幸,吾当再接再厉,让读者获得更多帮助。

获取 Android 设备任务栈信息

命令:adb shell dumpsys activity | grep run

阅读全文 »

深度学习与 TensorFlow —— 基础篇

发表于 2018-01-14 | 分类于 深度学习 | | 阅读次数:

前言

随着谷歌的 AlphaGo 以 4:1 的悬殊比分轻松击败韩国著名九段围棋大师李世石,人工智能(AI)走进了人们的视野,这个沉寂了近 30 年的名词 —— 人工智能,异军突起,正在逐渐在每个细节上改变我们的生产能力,改变我们的生活。

到现在,靠机器人来扫地,靠刷脸来取钱,靠自动驾驶来周游世界已然不是什么科幻小说中的内容了,这些事情已经真实的发生在我们的身边。

2017 年 7 月 8 日,国务院发布文件「国务院关于印发新一代人工智能发展规划的通知」,为的便是抢抓人工智能发展的重大战略机遇,构筑我国人工智能发展的先发优势,加快建设创新型国家和世界科技强国。

阅读全文 »

Java 引用类型和单例设计模式

发表于 2018-01-07 | 分类于 Java , 引用 | | 阅读次数:

Java中有哪几种引用?它们的含义和区别是什么?

在JDK 1.2以前的版本中,若一个对象不被任何变量引用,那么程序就无法再使用这个对象。也就是说,只有对象处于可触及(reachable)状态,程序才能使用它。从JDK 1.2版本开始,把对象的引用分为4种级别,从而使程序能更加灵活地控制对象的生命周期。这4种级别由高到低依次为:强引用、软引用、弱引用和虚引用。

  1. 强引用(StrongReference)

强引用是使用最普遍的引用。如果一个对象具有强引用,那垃圾回收器绝不会回收它。当内存空间不足,Java虚拟机宁愿抛出OutOfMemoryError错误,使程序异常终止,也不会靠随意回收具有强引用的对象来解决内存不足的问题。 ps:强引用其实也就是我们平时A a = new A()这个意思。

阅读全文 »

2017 年终总结

发表于 2017-12-29 | 分类于 总结 | | 阅读次数:

前言

今天是 2017 年最后一个工作日,时间过得真快,一年的时间就在我的眼前这样的溜走了,这一年发生了很多事情,对我也有很大的触动,也可以这么说,这一年我成长了很多。

工作

记得去年我还在教 java 的知识,做教案,自己学习,为的是让我的学生能通过我的教学,掌握他们将来吃饭的工具。但是,这也暴露出一个问题,我利用我的所有时间总结经验,传授知识,然而我的成长点在哪里?我是在不断的放电,看不到自己的成长点在哪里。

我觉得我的青春不应该浪费在讲台,而应该投入到实际的生产实践中去。因此,今年的年初,我完成了这一职业上的转型。

来到公司以后,可以说成长速度飞快,做一款 APP 的过程中,发现问题,解决问题,苦思冥想,绞尽脑汁,这是我想要的工作状态。这一年,项目基本上一个接着一个的,比较紧密,过得比较充实,我很满意。

阅读全文 »

Parcelable 对比 Serializable

发表于 2017-12-27 | 分类于 Android , Parcelable | | 阅读次数:

Parcelable和Serializable有什么用,它们有什么差别?

Parcelable 和 Serializable 经常用于序列化和反序列化 java 对象。它们两个的不同经常围绕着实现方式和性能结果被提出。它们的差别在于:

  • 在 Parcelable 中,开发者为了序列化和反序列化,自己实现代码,所以相比于 Serializable 很少产生垃圾对象。Parcelable 相比与 Serializable 性能有很大的提升(大概快两倍),因为是自定义实现的。
  • Serializable 是一种标记实现,这种实现意味着用户不能根据他们的需求序列化数据。在 Serializable 中,序列化操作在 java 虚拟机(JVM)里使用反射的 API 实现的。这样不仅有助于识别 java 对象的成员和方法,而且最终也创建了很多垃圾。由于这些,Serializable 过程相比 Parcelable 过程要慢。
阅读全文 »

解决 GitHub 文件名称大小写问题

发表于 2017-12-26 | 分类于 解决方案 | | 阅读次数:

出现场景

我的个人博客是部署在 GitHub 上的,其中分类中有一栏 android 的分类,其下还有其他分类,层级分布如下图所示

分类层级图

阅读全文 »
1234
bleedyao

bleedyao

时间考验一切,经得起时间考验的就为人所信仰

31 日志
25 分类
12 标签
GitHub
© 2017 — 2018 bleedyao
由 Hexo 强力驱动
| |
主题 — NexT.Gemini v5.1.3