<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[ITRenj的博客]]></title><description><![CDATA[相互学习，共同进步]]></description><link>https://blog.youkuaiyun.com/ITRenj</link><language>zh-cn</language><generator>https://blog.youkuaiyun.com/</generator><copyright><![CDATA[Copyright &copy; ITRenj]]></copyright><item><title><![CDATA[Fragment(四)常见问题]]></title><link>https://blog.youkuaiyun.com/ITRenj/article/details/125791268</link><guid>https://blog.youkuaiyun.com/ITRenj/article/details/125791268</guid><author>ITRenj</author><pubDate>Thu, 14 Jul 2022 19:24:53 +0800</pubDate><description><![CDATA[通过这篇博客，我们能知道以下问题：
* `Fragment` 在不同情况下实现网络延迟
* `Fragment` 为什么一定要有无参构造？
* `Fragment` 与 `Activity` 传递数据方式
* 嵌套 `Fragment` 时父 `Fragment` 生命周期传递到子 `Fragment` 中的方式......]]></description><category></category></item><item><title><![CDATA[Fragment(三)ViewPager中使用Fragment]]></title><link>https://blog.youkuaiyun.com/ITRenj/article/details/125791220</link><guid>https://blog.youkuaiyun.com/ITRenj/article/details/125791220</guid><author>ITRenj</author><pubDate>Thu, 14 Jul 2022 19:22:49 +0800</pubDate><description><![CDATA[通过这篇博客，我们能知道以下问题：
* `Fragment` 加载到 `ViewPage`上的过程和用户可见性判断
* `Fragment` 加载到 `ViewPage2`上的过程和用户可见性判断]]></description><category></category></item><item><title><![CDATA[Fragment(二)状态改变与管理]]></title><link>https://blog.youkuaiyun.com/ITRenj/article/details/124796563</link><guid>https://blog.youkuaiyun.com/ITRenj/article/details/124796563</guid><author>ITRenj</author><pubDate>Mon, 16 May 2022 11:39:26 +0800</pubDate><description><![CDATA[通过这篇博客，我们能知道以下问题：
`Fragment` 的 `mState` 变化过程
 `FragmentManager` 的 `mCurState` 变化过程]]></description><category></category></item><item><title><![CDATA[Fragment(一)从源码角度看add和replace过程]]></title><link>https://blog.youkuaiyun.com/ITRenj/article/details/124614043</link><guid>https://blog.youkuaiyun.com/ITRenj/article/details/124614043</guid><author>ITRenj</author><pubDate>Fri, 06 May 2022 16:58:55 +0800</pubDate><description><![CDATA[通过这篇博客，我们能知道以下问题：
 `Fragment` `add()` 和 `replace()` 方法差别
 从源码角度分析 `add()` 和 `replace()` 方法]]></description><category></category></item><item><title><![CDATA[View和ViewGroup中的mParent]]></title><link>https://blog.youkuaiyun.com/ITRenj/article/details/118112849</link><guid>https://blog.youkuaiyun.com/ITRenj/article/details/118112849</guid><author>ITRenj</author><pubDate>Tue, 22 Jun 2021 18:24:36 +0800</pubDate><description><![CDATA[View和ViewGroup中的mParent
源码版本为 Android 10（Api 29），不同Android版本可能有一些差别
mParent从名字看，应该表示父View，而这篇博客我们就是要探索View和ViewGroup中的mParent分别表示什么，以及在什么地方赋值的。
页面顶层View(DecorView)中 mParent 表示的什么？
通过《Activity 的组成》 我们知道了界面的顶层View是DecorView，那么我们查看mParent的来源，首先就应该查看 DecorView]]></description><category></category></item><item><title><![CDATA[Activity常见问题]]></title><link>https://blog.youkuaiyun.com/ITRenj/article/details/117824802</link><guid>https://blog.youkuaiyun.com/ITRenj/article/details/117824802</guid><author>ITRenj</author><pubDate>Fri, 11 Jun 2021 18:05:59 +0800</pubDate><description><![CDATA[Activity常见问题
通过这篇博客，我们能知道以下问题：

Activity 各种情况下的生命周期
弹出 Dialog 对 Activity 生命周期有什么影响？
onActivityResult() 在哪两个生命周期之间回调？
Activity 在 onResume() 之后才显示的原因是什么?
通过 Sheme 协议打开 Activity
Activity 什么时候会发生重建？
在 Activity 的 onCreate() 方法里写死循环会 ANR 吗？

1. Activity 生命周期方法相关]]></description><category></category></item><item><title><![CDATA[Android Handler机制]]></title><link>https://blog.youkuaiyun.com/ITRenj/article/details/114399825</link><guid>https://blog.youkuaiyun.com/ITRenj/article/details/114399825</guid><author>ITRenj</author><pubDate>Fri, 05 Mar 2021 16:00:43 +0800</pubDate><description><![CDATA[《Android Handler机制》
《Android Handler分析（一） Handler和Message详解》
《Android Handler分析 (二) MessageQueue详解》
《Android Handler分析 (三) Looper详解和Handler其他知识》
《Android 中的 HandlerThread 类详解》

作为一个Android程序员，我想大家都知道在做一些比较耗时的操作的时候都不会放在主线程，比如网络请求、数据库操作等(尤其是网络请求，在Android4.0.]]></description><category></category></item><item><title><![CDATA[Android Activity——启动过程探索（三）]]></title><link>https://blog.youkuaiyun.com/ITRenj/article/details/114296765</link><guid>https://blog.youkuaiyun.com/ITRenj/article/details/114296765</guid><author>ITRenj</author><pubDate>Tue, 02 Mar 2021 23:01:35 +0800</pubDate><description><![CDATA[在《Android Activity——启动过程探索（一） 和 《Android Activity——启动过程探索（二）  中我们知道了Activity启动的生命周期回调，并且分析了其中当前Activity的 onPause() 和新打开的Activity的 onCreate() 、 onStart()和onResume()回调执行过程，也就是新的Activity已经完成了 “创建-&gt;用户可见-&gt;用户可操作” 的过程。那么当前的Activity就变为不可见了，需要执行 onstop() 回调，如]]></description><category></category></item><item><title><![CDATA[Android Activity——启动过程探索（二）]]></title><link>https://blog.youkuaiyun.com/ITRenj/article/details/114129474</link><guid>https://blog.youkuaiyun.com/ITRenj/article/details/114129474</guid><author>ITRenj</author><pubDate>Fri, 26 Feb 2021 14:05:16 +0800</pubDate><description><![CDATA[在《Android Activity——启动过程探索（一）》中我们知道了Activity启动的生命周期回调，并且分析了其中当前Activity的 onPause() 和新打开的Activity的 onCreate() 回调方法执行步骤，在这篇文章中接着分析新打开的Activity的 onStart()和onResume()回调执行过程。
注意：以下分析过程，源码版本为 Android 10（Api 29），不同Android版本可能有一些差别。
新的Activity调用 onStart()

根据上图查看对]]></description><category></category></item><item><title><![CDATA[Android Activity——启动过程探索（一）]]></title><link>https://blog.youkuaiyun.com/ITRenj/article/details/113759320</link><guid>https://blog.youkuaiyun.com/ITRenj/article/details/113759320</guid><author>ITRenj</author><pubDate>Mon, 08 Feb 2021 16:53:45 +0800</pubDate><description><![CDATA[Activity 生命周期：

首先来看一下当Activity启动时，会回调哪些生命周期的方法：

不关闭当前Activity启动流程：



关闭当前Activity启动流程：


对于上面的回调过程，我想大部分Android开发者都是知道的，但是对于系统是怎样一步一步来回调这些方法的，可能存在不少疑问。下面我们就通过源码来看看当我们调用 startActivity() 和 finish() 方法时系统是怎样一步步来回调各个方法的。
其实对于每一个生命周期方法的调用，都可以看做是一小步，所以我们的分析就可]]></description><category></category></item><item><title><![CDATA[Android Service 流程分析]]></title><link>https://blog.youkuaiyun.com/ITRenj/article/details/110007831</link><guid>https://blog.youkuaiyun.com/ITRenj/article/details/110007831</guid><author>ITRenj</author><pubDate>Mon, 23 Nov 2020 21:11:47 +0800</pubDate><description><![CDATA[在前面已经对Service基本使用及aidl使用及源码进行的分析。在这篇文章中，我们来看一下Android Service的启动流程和绑定流程，以便于更好的理解Android Service的机制。
启动Service过程
Android Service启动时序图

上图就是Android Service启动时序图，对照图查看代码。
我们在 Activity 中调用 startService() 方法时，直接调用了 调用 ContextWrapper 的 startService()
@Override
p]]></description><category></category></item><item><title><![CDATA[Android Service aidl分析]]></title><link>https://blog.youkuaiyun.com/ITRenj/article/details/109552344</link><guid>https://blog.youkuaiyun.com/ITRenj/article/details/109552344</guid><author>ITRenj</author><pubDate>Sat, 07 Nov 2020 21:08:26 +0800</pubDate><description><![CDATA[《Android Service基础》


《Android Service回调和配置》


《Android Service aidl使用及进阶》


《Android Service更多知识》


《Android 中的 IntentService 类详解》


Android Service 代码地址


在介绍正文之前,我们先看看几个知识点进程、线程和Android中的进程间通讯(IPC)。

线程：线程时CPU调度的最小单元，同时线程也是一种有限的系统资源。
进程：进程一般表示一个执行单元，在..]]></description><category></category></item><item><title><![CDATA[Android FlowLayout 流式布局]]></title><link>https://blog.youkuaiyun.com/ITRenj/article/details/109451092</link><guid>https://blog.youkuaiyun.com/ITRenj/article/details/109451092</guid><author>ITRenj</author><pubDate>Mon, 02 Nov 2020 16:13:02 +0800</pubDate><description><![CDATA[FlowLayout 流式布局
Android 流式布局控件，实现自动换行，操出范围可以滑动功能，未使用控件复用功能，所以不应该有太多的子控件。
主要包含功能：

流式布局，自动换行
使用Adapter的形势注入子控件
设置子控件之间的间距(水平方向和竖直方向)
竖直方向超出高度可以滑动
给子控件设置点击监听
设置可显示的最大行数，并提供方法判断是否当前所有的子控件都显示完成
可以设置行内水平方向上对齐方式（居左对齐、居右对齐、两端对齐/左右对齐、居中对齐）
提供自动滚动到顶部、滚动到底部、滚动到指定位置和]]></description><category></category></item><item><title><![CDATA[Android Service更多知识]]></title><link>https://blog.youkuaiyun.com/ITRenj/article/details/109348715</link><guid>https://blog.youkuaiyun.com/ITRenj/article/details/109348715</guid><author>ITRenj</author><pubDate>Thu, 29 Oct 2020 00:10:27 +0800</pubDate><description><![CDATA[这篇文章主要介绍的是一些Service的相关知识，绑定服务中服务器异常中断时处理办法（死亡代理 DeathRecipient）、服务器数据更新后实时通知客户端（回调通知以及RemoteCallbackList）、Service运行线程说明、使用 Messenger 实现 Servie 与 Client 端通信、可以执行耗时操作的Service（IntentService）、怎样选择什么类型的Service
死亡代理 DeathRecipient
在前面的几篇文章中，我么知道了服务的绑定、aidl的使用等，我]]></description><category></category></item><item><title><![CDATA[Android Service aidl使用及进阶]]></title><link>https://blog.youkuaiyun.com/ITRenj/article/details/109299144</link><guid>https://blog.youkuaiyun.com/ITRenj/article/details/109299144</guid><author>ITRenj</author><pubDate>Mon, 26 Oct 2020 21:11:10 +0800</pubDate><description><![CDATA[AIDL：Android 接口定义语言，可以利用它定义客户端与服务均认可的编程接口，以便二者使用进程间通信 (IPC) 进行相互通信。在 Android 中，一个进程通常无法访问另一个进程的内存。因此，为进行通信，进程需将其对象分解成可供操作系统理解的原语，并将其编组为可供操作的对象。编写执行该编组操作的代码较为繁琐，因此 Android 使用 AIDL 为简化此问题。
注意： 只有在需要不同应用的客户端通过 IPC 方式访问服务，并且希望在服务中进行多线程处理时，才有必要使用 AIDL。如果无需跨不同应用]]></description><category></category></item><item><title><![CDATA[数据结构——链表（二）]]></title><link>https://blog.youkuaiyun.com/ITRenj/article/details/109265286</link><guid>https://blog.youkuaiyun.com/ITRenj/article/details/109265286</guid><author>ITRenj</author><pubDate>Sat, 24 Oct 2020 20:38:36 +0800</pubDate><description><![CDATA[在《数据结构——链表（一）》一文中，我们介绍了链表的基本操作与实现，这篇文章我们来进一步学习链表的一些操作
链表进阶
判断单向链表是否有环
快慢指针法： 定义两个指针，通过两个指针的移动速度不同来实现功能，常用来寻找中间节点（快指针移动速度是慢指针的两倍，快指针移动到结尾时，慢指针刚好在中间）、判断单链表是否有环等操作。
利用快慢指针法判断单链表是否有环的代码实现如下：
public boolean hasCircle() {
    if (header == null) return false;
  ]]></description><category></category></item><item><title><![CDATA[数据结构——链表（一）]]></title><link>https://blog.youkuaiyun.com/ITRenj/article/details/109264959</link><guid>https://blog.youkuaiyun.com/ITRenj/article/details/109264959</guid><author>ITRenj</author><pubDate>Sat, 24 Oct 2020 20:23:52 +0800</pubDate><description><![CDATA[链表基础
链表
链表是由一组不必相连【不必相连：可以连续也可以不连续】的内存结构，按特定的顺序链接在一起的抽象数据类型。是一种线性表，但是并不会按线性的顺序存储数据，而是在由一个个节点组成，节点一般包含存放数据的数据域和存放指针的指针域。
补充：
    抽象数据类型（Abstract Data Type [ADT]）：表示数学中抽象出来的一些操作的集合。
    内存结构：内存中的结构，如：struct、特殊内存块...等等之类；

下图就是一种简单的链表

对比数组
数组是在相连的内存空间，由相同数据类]]></description><category></category></item><item><title><![CDATA[Android Service回调和配置]]></title><link>https://blog.youkuaiyun.com/ITRenj/article/details/108860672</link><guid>https://blog.youkuaiyun.com/ITRenj/article/details/108860672</guid><author>ITRenj</author><pubDate>Tue, 29 Sep 2020 00:39:55 +0800</pubDate><description><![CDATA[Service 生命周期方法回调
创建服务，必须创建 Service 的子类（或使用它的一个现有子类）。可以重写一些回调方法，从而处理服务生命周期的某些关键方面，主要的回调方法有 onCreate()、onBind()、onRebind()、onStartCommand()、onStart()、onUnbind()、onDestroy()。
onCreate()
首次创建服务时，系统会（在调用 onStartCommand() 或 onBind() 之前）调用此方法来执行一次性设置程序。如果服务已在运行，则]]></description><category></category></item><item><title><![CDATA[Android Service基础]]></title><link>https://blog.youkuaiyun.com/ITRenj/article/details/108839052</link><guid>https://blog.youkuaiyun.com/ITRenj/article/details/108839052</guid><author>ITRenj</author><pubDate>Sun, 27 Sep 2020 23:42:09 +0800</pubDate><description><![CDATA[简单介绍
Service 是一种可在后台执行长时间运行操作而不提供界面的应用组件。服务可由其他应用组件启动，而且即使用户切换到其他应用，服务仍将在后台继续运行。此外，组件可通过绑定到服务与之进行交互，甚至是执行进程间通信 (IPC)。例如，服务可在后台处理网络事务、播放音乐，执行文件 I/O 或与内容提供程序进行交互。服务可以分为前台、后台和绑定三种类型。
分类
前台服务
前台服务执行一些用户能注意到的操作。例如，音频应用会使用前台服务来播放音频曲目。前台服务必须显示通知。即使用户停止与应用的交互，前台服务]]></description><category></category></item><item><title><![CDATA[gradle常用命令和查看错误]]></title><link>https://blog.youkuaiyun.com/ITRenj/article/details/105236513</link><guid>https://blog.youkuaiyun.com/ITRenj/article/details/105236513</guid><author>ITRenj</author><pubDate>Wed, 01 Apr 2020 00:29:12 +0800</pubDate><description><![CDATA[Gradle 常用命令和查看错误信息
Gradle 是 Android 现在主流的编译工具，使用它可以帮助我们编译、打包APP等过程。同时，我们也可以为Gradle指定构建规则，让它按照我们的指定构建应用。在Android中，我们常用的clean、build等其实就是使用的gradle方式来进行构建的，只是这些Android studio帮我们做了，我们只需要在界面上进行点击就可以了。但是，还有一...]]></description><category></category></item></channel></rss>