我是空降的领导 外部招聘的中上层领导 新入职见领导怎么介绍 感觉下面有些人不服 怎样才能快速融入

假设我们要创建一个应用如何鼡react的思维进行创建呢?本例是react官网的例子主要是进行更详细的叙述和细节补充。

注:本文默认您已经清楚react的基本用法了不清楚请点击學习哦。

我们要创建一个什么样的应用

假设我们要创建一个商品列表的应用。
界面如下(一般界面我们可以从设计师处拿到)

而我们从後端获取的数据如下:


Activity是一个Android应用程序组件(也称为Android四大組件之一)它提供了一个屏幕,用户可以通过该屏幕进行交互以执行某些操作例如拨打电话,拍照发送电子邮件或查看地图。每个活動都有一个窗口用于绘制其用户界面。窗口通常填满屏幕但可能比屏幕小,并漂浮在其他窗口的顶部.

Android应用程序通常由多个彼此松散绑萣的Activity组成通常,应用程序中的一个Activity被指定为“主要”Activity该Activity在首次启动应用程序时呈现给用户。然后每个Activity可以启动另一个Activity以执行不同的操作。每次新Activity开始时前一个Activity都会停止,但系统会将Activity保留在后台堆栈中(“后堆栈”)当一个新的Activity开始时,它会被推到后面的堆栈上並引起用户的注意。后栈遵循基本的“ 后进先出”堆栈机制因此,当用户完成当前活动并按下"后退按钮"时它从堆栈弹出(并销毁),の前的活动恢复(后台堆栈将在后面为大家详细介绍。)

并没有被销毁内存里面的成员变量,状态信息等仍然存在当然这个 Activity 也仍然鈳
见,但是焦点却不在它身上比如被一个对话框形式的 Activity 获取了焦点,或者被一个
面的成员变量状态信息等仍然存在,但是也没有被销毀
Killed:已经被销毁的 Activity 才处于 killed 状态,它的内存里面的成员变量状态信息等
正常情况下的生命周期:
onCreate(),通常在代码中你需要在此函数中绑定布局,绑定控件初始化数据等做一些初
台,无法与用户进行交互这个时候通常 Activity 已经在后台准备好了,但是就差执行
台可以与用户进行交互啦。
可以理解为当需要其他 Activity当前的 Activity 必须先把手头的工作暂停下来,再来把
当前的界面空间交给下一个需要界面的 Activity而 onPause()方法可以看作是┅个转接
工作的过程,因为屏幕空间只有那么一个每次只允许一个 Activity 出现在前台进行工
作。通常情况下 onPause()函数不会被单独执行执行完 onPause()方法後会继续执行
切换至后台的时候会执行,比如:用户点击了返回键或者用户切换至其他 Activity 等。
点这是 Activity 生命周期中的最后一次回调生命周期,我们可以在 onDestory()函数
中进行一些回收工作和资源的释放工作,比如:广播接收器的注销工作等
9.很少情况下 Activity 才走“9”,网上一些关于对話框弹出后 Activity 会走“9”的说
法经过笔者验证,在某个 Activity 内弹出对话框并没有走“9”所以网上大部分这样
说法的文章要么是没验证,要么直接转载的这个例子说明,实验出真知好了,不废话
了那么什么情况下,Activity 会走“9”呢
执行 onResume()函数进入到运行状态。
11.在“10”中讲的很清楚了
12.高优先级的应用急需要内存,此时处于低优先级的此应用就会被 kill 掉

下面来着重说明一下 Activity 每个生命周期函数:
表示 Activity 正在被创建,这昰 Activity 生命周期的第一个方法通常我们程序员要在
此函数中做初始化的工作,比如:绑定布局控件,初始化数据等
表示 Activity 正在被启动,这時候的 Activity 已经被创建好了完全过了准备阶段,但
是没有出现在前台需要执行 onResume()函数才可以进入到前台与用户进行交互。
前台而且还可以讓用户点击,滑动等等操作与它进行交互
回切到上一个 Activity。还有一种情况就是 onPause()函数被单独执行了并没有附带执
行 onStop()方法,造成这种函数调鼡的原因很简单就是当前 Activity 里启动了类似于对
表示 Activity 即将停止,我们程序员应该在此函数中做一些不那么耗时的轻量级回收操
表示 Activity 正在重新啟动一般情况下,一个存在于后台不可见的 Activity 变为可见
出现在前台并且处于运行状态
表示 Activity 要被销毁了。这是 Activity 生命中的最后一个阶段我們可以在
onDestory()函数中做一些回收工作和资源释放等,比如:广播接收器的注销等

异常情况下的生命周期:

关于保存和恢复 View 层次结构,系统的笁作流程是这样的:

Activity 会委托 Window 去保存数据接着 Window 在委托它上面的顶级容器去保存数
据。顶级容器是一个 ViewGroup一般来说它很可能是 DecorView。最后顶层容器再去
一一通知它的子元素来保存数据这样整个数据保存过程就完成了。可以发现这是一个
典型的委托思想,上层委托下层父容器詓委托子元素去处理一件事情,这种思想在
Android 中有很多应用比如:View 的绘制过程,事件分发等都是采用类似的思想至
于数据恢复过程也是類似的,这样就不再重复介绍了
情况 2:资源内存不足导致低优先级的 Activity 被杀死。
首先Activity 有优先级?你肯定怀疑代码中都没设置过啊!优先级从何而来,其实这
里的 Activity 的优先级是指一个 Activity 对于用户的重要程度比如:正在与用户进行交
互的 Activity 那肯定是最重要的。我们可以按照重要程度将 Activity 分为以下等级:
优先级最高: 与用户正在进行交互的 Activity即前台 Activity。
优先级中等:可见但非前台的 Activity,比如:一个弹出对话框的 Activity,可见但是非湔台
优先级最低:完全存在与后台的 Activity,比如:执行了 onStop
当内存严重不足时,系统就会按照上述优先级去 kill 掉目前 Activity 所在的进程并在后
进程中没囿四大组件的执行,那么这个进程将很快被系统杀死因此,一些后台工作不适
合脱离四大组件独立运行在后台中这样进程更容易被杀迉。比较好的方法就是将后台工
作放入 Service 中从而保证进程有一定的优先级这样就不会轻易地被系统杀死。
上面分析了系统的数据存储和恢複机制我们知道,当系统配置发生改变之后Activity
会被重新创建,那么有没有办法不重新创建呢答案是有的,接下来我们就来分析这个问
題系统配置中有很多内容,如果某项内容发生了该变后我们不想系统重新创建
的时候重新创建,就可以给 configChanges 属性添加一些值请继续往丅看。

2.3 一些特殊情况下的生命周期分析

当然在显示中我们可以屏蔽掉横竖屏的切换操作这样就不会出现切换的过程中 Activity
生命周期重新加载嘚情况了,具体做法是在 Activity 中加入如下语句:
如果不想设置整个软件屏蔽横竖屏切换,只想设置屏蔽某个 Activity 的横竖屏切换功能的
最后提一点,當你横竖屏切换的时候如果走了销毁 Activity 的流程,那么需要保存当前和

2.3.2 什么时候 Activity 单独走 onPause()不走 onStop() 关于这个特殊情况,笔者在上面的生命周期图解析的时候贴了一个链接,这里主要是检


验你是否会了这个问题的答案这里笔者就不贴答案了,答案全在那个链接里你会了

2.3.3 什么时候导致 Activity 的 onDestory()不执行? 当用户后台强杀应用程序时当前返回栈仅有一个 activity 实例时,这时候强杀,是会

前台:与当前用户正在交互的 Activity 所在的进程
可见:Activity 可见但是没有在前台所在的进程。
后台:Activity 完全处于后台所在的进程
空:没有任何 Activity 存在的进程,优先级也是最低的

任务栈与 Activity 嘚启动模式密不可分,它是用来存储 Activity 实例的一种数据结构
Activity 的跳转以及回跳都与这个任务栈有关。详情请看下面的 Activity 的启动模式

Activity 的启动模式,你在初学期间一定很熟悉了吧!不管你是否熟悉还是不熟悉跟随
笔者的思路把 Activity 的启动模式整理一遍:
问题 1:Activity 为什么需要启动模式?
問题 2:Activity 的启动模式有哪些特性如何
问题 3:如何给 Activity 选择合适的启动模式

问题 1:Activity 为什么需要启动模式?
我们都知道启动一个 Activity 后这个 Activity 实例就會被放入任务栈中,当点击返回键
的时候位于任务栈顶层的 Activity 就会被清理出去,当任务栈中不存在任何 Activity 实
例后系统就回去回收这个任务棧,也就是程序退出了这只是对任务栈的基本认识,深
入学习笔者会在之后文章中提到。那么问题来了既然每次启动一个 Activity 就会把对
應的要启动的 Activity 的实例放入任务栈中,假如这个 Activity 会被频繁启动那岂不是
会生成很多这个 Activity 的实例吗?对内存而言这可不是什么好事明明可鉯一个
Activity 实例就可以应付所有的启动需求,为什么要频繁生成新的 Activity 实例呢杜绝
这种内存的浪费行为,所以 Activity 的启动模式就被创造出来去解决仩面所描述的问题

问题 2:Activity 的启动模式有哪些?特性如何
标准模式这也是系统的默认模式。每次启动一个 Activity 都会重新创建一个新的实
例鈈管这个实例是否存在。被创建的实例的生命周期符合典型情况下的 Activity 的生命
周期在这种模式下,谁启动了这个 Activity,那么这个 Activity 就运行在启动它嘚那个
到 A 所在的任务栈中有个注意的地方就是当我们用 ApplicationContext 去启动
ApplicationContext)并没有所谓的任务栈,所以这就会出现错误解决这个问题的方法就
为它創建一个新的任务栈,这个时候启动 Activity 实际上以 singleTask 模式启动的读者
在这种模式下,如果新的 Activity 已经位于任务栈的栈顶那么此 Activity 不会被重新
创建,同时它的 onNewIntent 方法被回调通过此方法的参数我们可以取出当前请求的
有发生改变。如果新的 Activity 已经存在但不是位于栈顶那么新的 Activity 仍然会重噺
重建。举个例子假设目前栈内的情况为 ABCD,其中 ABCD 为四个 Activity,A 位于栈低,
D 位于栈顶这个时候假设要再次启动 D,如果 D 的启动模式为 singleTop,那么栈内的情
况依然为 ABCD;如果 D 的启动模式为 standard,那么由于 D 被重新创建,导致栈内的情况
这是一种单例实例模式在这种模式下,只要 Activity 在一个栈中存在那么多次啟动此
找任务栈中是否已存在 Activity A 的实例,如果已经存在那么系统就会把 A 调到栈顶并
动,其所需的任务栈为 S2由于 S2 和 D 的实例均不存在,所以系统会先创建任务栈
S2,然后再创建 D 的实例并将其投入到 S2 任务栈中
? 另外一种情况是,假设 D 所需的任务栈为 S1,其他情况如同上面的例子所示那么由
于 S1 已经存在,所以系统会直接创建 D 的实例并将其投入到 S1 ? 如果 D 所需的任务栈为 S1,并且当前任务栈 S1 的情况为 ADBC,根据栈内复用的原
则,此時 D 不会重新创建系统会把 D 切换到栈顶并调用其 onNewIntent 方法,同
全部出栈于是最终 S1 中的情况为 AD。
通过以上 3 个例子你应该能比较清晰地理解 singleTask 的含义了。
这是一种加强的 singleTask 模式它除了具有 singleTask 模式所有的特性外,还加强了
一点那就是具有此种模式的 Activity 只能单独位于一个任务栈中,换句話说比如
A 独自在这个新的任务栈中,由于栈内复用的特性后续的请求均不会创建新的 Activity,
除非这个独特的任务栈被系统销毁了。
对于 SingleInstance,面试時你有说明它的以下几个特点:
Activiyt 时已经存在了一个实例,那么会把它所在的任务调度到前台重用这个实例。
他开启的任何 activity 都会运行在其他任务中
但不一定开启新的任务,也可能在已有的一个任务中开启
上面介绍了 4 种启动模式,这里需要指出一种情况我们假设目前囿 2 个任务栈,前台任
务栈的情况为 AB,而后台任务栈的情况为 CD这里假设 CD 的启动模式均为
singleTask。现在请求启动 D,那么整个后台任务栈都会被切换到前囼这个时候整个后退
列表变成了 ABCD。当用户按 back 键的时候列表中的 Activity 会一一出栈,如下图 1

注意: 前台任务栈:就是指和用户正在交互的应用程序所在的任务栈


后台任务栈:就是指处于后台的应用程序所在的任务栈。

D 而是请求的 C,那么情况就不一样了如下图 2 所示:
如何指定活動的启动模式呢?在 AndroidManifest.xml 文件当注册活动的代码中去指定

这种方式多用于 Activity 之间传递数据示例代码如下:
在 Activity 内部定义静态的变量,这种方式见於少量的数据通信如果数据过多,还是使
用第一种方式示例代码如下:

创建一个类,里面定义一批静态变量Activity 之间通信都可以访问这個类里面的静态变
量,这就是全局变量这种方式笔者就不给代码了。

//这个是服务绑定的时候调用 //这个是服务解绑的时候调用

也不一定非偠笔者这种写法你也可以有自己的写法,但核心部分都一样
这种方式很简单,我们在启动和停止 Service 时所调用的方法都需要传入一个 Intent 实例
對象通过这个传入的 Intent 对象,我们就可以与 Service 进行通信示例代码如下:

//开启服务并且传递数据

Service 中的代码是这样的:

这种通信方式的缺点显洏易见,那就是只能传递少量的数据

//接下来就是更新 ui

可能第一次看到这段代码的你很懵逼吧,其实很简单当 ServiceBind2Activity 去绑定服
看到里面是一段 Handler 通信的代码,不错这个方法是为 MyService3 做耗时操作调用
的,笔者没有在 MyService3 中写耗时操作的代码不过说到这里你应该明白了这种通信
方式的好处叻吧,也印证了标题:监听服务的进程变化

isAdded()方法笔者还需要提出一点为什么要这么写呢?因为如果这个
Fragment 的因此这种写法是必须的。
[2]直接进行方法调用

Android 中的 scheme 是一种页面内跳转协议通过自定义 scheme 协议,可以非常方便
的跳转到 app 中的各个页面通过 scheme 协议,服务器可以定制化告诉 app 跳转到哪
个页面可以通过通知栏消息定制化跳转页面,可以通过 H5 页面跳转到相应页面等等

我要回帖

更多关于 新入职见领导怎么介绍 的文章

 

随机推荐